java 算法 6种排序小结
短信预约 -IT技能 免费直播动态提醒
冒泡排序
package 冒泡排序;
import java.util.Arrays;
public class Bubble {
public static int[] sort(int[] a){
for (int i=a.length-1;i>0;i--){
for (int j=0;j<i;j++){
if(greater(a[j],a[j+1])){
exch(a,j,j+1);
}
}
}
return a;
}
private static Boolean greater(int v,int w){
if (v>=w){
return true;
}
return false;
}
private static void exch(int[] a,int i,int j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
public static void main(String[] args) {
int[] a={4,5,6,3,2,1};
int[] sort = Bubble.sort(a);
System.out.println(Arrays.toString(sort));
}
}
选择排序
package cn.itcast.algorithm.sort;
public class Selection {
public static void sort(Comparable[] a){
for(int i=0;i<=a.length-2;i++){
//定义一个变量,记录最小元素所在的索引,默认为参与选择排序的第一个元素所在的位置
int minIndex = i;
for(int j=i+1;j<a.length;j++){
//需要比较最小索引minIndex处的值和j索引处的值;
if (greater(a[minIndex],a[j])){
minIndex=j;
}
}
//交换最小元素所在索引minIndex处的值和索引i处的值
exch(a,i,minIndex);
}
}
private static boolean greater(Comparable v,Comparable w){
return v.compareTo(w)>0;
}
private static void exch(Comparable[] a,int i,int j){
Comparable temp;
temp = a[i];
a[i]=a[j];
a[j]=temp;
}
}
插入排序
package 插入排序;
import java.util.Arrays;
public class Insertion {
public static void sort(int[] a){
for (int i=1;i<a.length;i++){
//当前元素为a[i],依次和i前面的元素比较,找到一个小于a[i]的元素
for (int j=i;j>0;j--){
if (greater(a[j-1],a[j])){
exch(a,j-1,j);
}else {
break;
}
}
}
}
private static Boolean greater(int v,int w){
if (v>=w){
return true;
}
return false;
}
private static void exch(int[] a,int i,int j){
int t=a[i];
a[i]=a[j];
a[j]=t;
}
public static void main(String[] args) {
int[] a={4,3,2,10,12,1,5,6};
Insertion.sort(a);
System.out.println(Arrays.toString(a));
}
}
希尔排序
package 希尔排序;
import java.util.Arrays;
public class Shell {
public static void sort(Comparable[] a) {
int N = a.length;
//确定增长量h的最大值
int h = 1;
while (h < N / 2) {
h = h * 2 + 1;
}
//当增长量h小于1,排序结束
while (h >= 1) {
//找到待插入的元素
for (int i = h; i < N; i++) {
//a[i]就是待插入的元素
//把a[i]插入到a[i-h],a[i-2h],a[i-3h]...序列中
for (int j = i; j >= h; j -= h) {
//a[j]就是待插入元素,依次和a[j-h],a[j-2h],a[j-3h]进行比较,如果a[j]小,那么交换位置,如果不小于,a[j] 大,则插入完成。
if (greater(a[j - h], a[j])) {
exch(a, j, j - h);
} else {
break;
}
}
}
h /= 2;
}
}
private static boolean greater(Comparable v, Comparable w) {
return v.compareTo(w) > 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
//测试代码
public static void main(String[] args) {
Integer[] a = {9, 1, 2, 5, 7, 4, 8, 6, 3, 5};
Shell.sort(a);
System.out.println(Arrays.toString(a));
}
}
归并排序
package 归并排序;
import java.util.Arrays;
public class Merge {
private static Comparable[] assist;//归并所需要的辅助数组
public static void sort(Comparable[] a) {
assist = new Comparable[a.length];
int lo = 0;
int hi = a.length - 1;
sort(a, lo, hi);
}
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo) {
return;
}
int mid = lo + (hi - lo) / 2;
//对lo到mid之间的元素进行排序;
sort(a, lo, mid);
//对mid+1到hi之间的元素进行排序;
sort(a, mid + 1, hi);
//对lo到mid这组数据和mid到hi这组数据进行归并
merge(a, lo, mid, hi);
}
private static void merge(Comparable[] a, int lo, int mid, int hi) {
//lo到mid这组数据和mid+1到hi这组数据归并到辅助数组assist对应的索引处
int i = lo;//定义一个指针,指向assist数组中开始填充数据的索引
int p1 = lo;//定义一个指针,指向第一组数据的第一个元素
int p2 = mid + 1;//定义一个指针,指向第二组数据的第一个元素
//比较左边小组和右边小组中的元素大小,哪个小,就把哪个数据填充到assist数组中
while (p1 <= mid && p2 <= hi) {
if (less(a[p1], a[p2])) {
assist[i++] = a[p1++];
} else {
assist[i++] = a[p2++];
}
}
//上面的循环结束后,如果退出循环的条件是p1<=mid,则证明左边小组中的数据已经归并完毕,如果退
//出循环的条件是p2 <= hi, 则证明右边小组的数据已经填充完毕;
//所以需要把未填充完毕的数据继续填充到assist中,//下面两个循环,只会执行其中的一个
while (p1 <= mid) {
assist[i++] = a[p1++];
}
while (p2 <= hi) {
assist[i++] = a[p2++];
}
//到现在为止,assist数组中,从lo到hi的元素是有序的,再把数据拷贝到a数组中对应的索引处
for (int index = lo; index <= hi; index++) {
a[index] = assist[index];
}
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
//测试代码
public static void main(String[] args) throws Exception {
Integer[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
Merge.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
快速排序
package 快速排序;
import java.util.Arrays;
public class Quick {
public static void sort(Comparable[] a) {
int lo = 0;
int hi = a.length - 1;
sort(a, lo, hi);
}
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo) {
return;
}
//对a数组中,从lo到hi的元素进行切分
int partition = partition(a, lo, hi);
//对左边分组中的元素进行排序
//对右边分组中的元素进行排序
sort(a, lo, partition - 1);
sort(a, partition + 1, hi);
}
public static int partition(Comparable[] a, int lo, int hi) {
Comparable key = a[lo];//把最左边的元素当做基准值
int left = lo;//定义一个左侧指针,初始指向最左边的元素
int right = hi + 1;//定义一个右侧指针,初始指向左右侧的元素下一个位置
//进行切分
while (true) {
//先从右往左扫描,找到一个比基准值小的元素
while (less(key, a[--right])) {//循环停止,证明找到了一个比基准值小的元素
if (right == lo) {
break;//已经扫描到最左边了,无需继续扫描
}
}
//再从左往右扫描,找一个比基准值大的元素
while (less(a[++left], key)) {//循环停止,证明找到了一个比基准值大的元素
if (left == hi) {
break;//已经扫描到了最右边了,无需继续扫描
}
}
if (left >= right) {
//扫描完了所有元素,结束循环
break;
} else {
//交换left和right索引处的元素
exch(a, left, right);
}
}
//交换最后rigth索引处和基准值所在的索引处的值
exch(a, lo, right);
return right;//right就是切分的界限
}
private static void exch(Comparable[] a, int i, int j) {
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
private static boolean less(Comparable v, Comparable w) {
return v.compareTo(w) < 0;
}
//测试代码
public static void main(String[] args) throws Exception {
Integer[] arr = {6, 1, 2, 7, 9, 3, 4, 5, 8};
Quick.sort(arr);
System.out.println(Arrays.toString(arr));
}
}
到此这篇关于java 算法 6种排序的文章就介绍到这了,更多相关java 算法排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341