分别对1k,1w,10w,20w大小的随机数组排序
得到综合结果是:
速度: 快速排序>>归并排序>>>>>插入排序>>选择排序>>冒泡排序
1,插入排序
先找待插入数字,然后提出来,与前面有序的数列对比,看比谁小就放在谁前面
public class InsertSort {public static void sort(int[] arr) {if (arr.length >= 2) {for (int i = 1; i < arr.length; i++) {//挖出一个要用来插入的值,同时位置上留下一个可以存新的值的坑int x = arr[i];int j = i - 1;//在前面有一个或连续多个值比x大的时候,一直循环往前面找,将x插入到这串值前面while (j >= 0 && arr[j] > x) {//当arr[j]比x大的时候,将j向后移一位,正好填到坑中arr[j + 1] = arr[j];j--;}//将x插入到最前面arr[j + 1] = x;}}}}
2,快速排序法
public class QuickSort {public static void sort(int[] arr,int begin,int end) {//先定义两个参数接收排序起始值和结束值int a = begin;int b = end;//先判断a是否大于bif (a >= b) {//没必要排序return;}//基准数,默认设置为第一个值int x = arr[a];//循环while (a < b) {//从后往前找,找到一个比基准数x小的值,赋给arr[a]//如果a和b的逻辑正确--a<b ,并且最后一个值arr[b]>x,就一直往下找,直到找到后面的值大于xwhile (a < b && arr[b] >= x) {b--;}//跳出循环,两种情况,一是a和b的逻辑不对了,a>=b,这时候排序结束.二是在后面找到了比x小的值if (a < b) {//将这时候找到的arr[b]放到最前面arr[a]arr[a] = arr[b];//排序的起始位置后移一位a++;}//从前往后找,找到一个比基准数x大的值,放在最后面arr[b]while (a < b && arr[a] <= x) {a++;}if (a < b) {arr[b] = arr[a];//排序的终止位置前移一位b--;}}//跳出循环 a < b的逻辑不成立了,a==b重合了,此时将x赋值回去arr[a]arr[a] = x;//调用递归函数,再细分再排序sort(arr,begin,a-1);sort(arr,a+1,end);}}
3,冒泡排序
跟前面的比较,小的往前
public class MaoPao {public static void sort(int[] arr){for (int i = 1; i < arr.length; i++) { //第一层for循环,用来控制冒泡的次数for (int j = 0; j < arr.length-1; j++) { //第二层for循环,用来控制冒泡一层层到最后//如果前一个数比后一个数大,两者调换 ,意味着泡泡向上走了一层if (arr[j] > arr[j+1] ){int temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}}
在这个版本中,改动了两点
第一点是加入了一个布尔值,判断第二层循环中的调换有没有执行,如果没有进行两两调换,说明后面都已经排好序了,已经不需要再循环了,直接跳出循环,排序结束.
第二点是第二层循环不再循环到arr.length - 1,因为外面的i循环递增一次,说明数组最后就多了一个排好序的大泡泡.第二层循环也就不需要到最末尾一位了,可以提前结束循环
/*** 终极版冒泡排序* 加入一个布尔变量,如果内循环没有交换值,说明已经排序完成,提前终止* @param arr*/public static void sortPlus(int[] arr){if(arr != null && arr.length > 1){for(int i = 0; i < arr.length - 1; i++){// 初始化一个布尔值boolean flag = true;for(int j = 0; j < arr.length - i - 1 ; j++){if(arr[j] > arr[j+1]){// 调换int temp;temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;// 改变flagflag = false;}}if(flag){break;}}}}
4,选择排序
首先在未排序数列中找到最小元素,然后将其与数列的首部元素进行交换,然后循环找 ,放在最前面
public static void sort(int[] arr){for(int i = 0; i < arr.length - 1 ; i++){int min = i; // 遍历的区间最小的值for (int j = i + 1; j < arr.length ;j++){if(arr[j] < arr[min]){// 找到当前遍历区间最小的值的索引min = j;}}if(min != i){// 发生了调换int temp = arr[min];arr[min] = arr[i];arr[i] = temp;}}}
5,归并排序
归并排序,分成两个数一组,排序,然后合起来 ,合并的规则是将其按从小到大的顺序放到一个临时数组中,再把这个临时数组替换原数组相应位置,
public static void mergeSort(int[] a,int s,int e){int m = (s + e) / 2;if (s < e){mergeSort(a,s,m);mergeSort(a,m+1,e);//归并merge(a,s,m,e);}}private static void merge(int[] a, int s, int m, int e) {//初始化一个从起始s到终止e的一个数组int[] temp = new int[(e - s) + 1];//左起始指针int l = s;//右起始指针int r = m+1;int i = 0;//将s-e这段数据在逻辑上一分为二,l-m为一个左边的数组,r-e为一个右边的数组,两边都是有序的//从两边的第一个指针开始遍历,将其中小的那个值放在temp数组中while (l <= m && r <= e){if (a[l] < a[r]){temp[i++] = a[l++];}else{temp[i++] = a[r++];}}//将两个数组剩余的数放到temp中while (l <= m){temp[i++] = a[l++];}while (r <= e){temp[i++] = a[r++];}//将temp数组覆盖原数组for (int n = 0; n < temp.length; n++) {a[s+n] = temp[n];}}
6,Arrays.sort()
Arrays工具类提供的排序方法。它内部实现也是快速排序
private static void arraysSort(int[] a){Arrays.sort(a);}
7,Collections.sort()
将数组转为list,使用集合的排序方法,但是这无异于兜圈子,因为集合底层也是数组
private static void listSort(int[] a){List<Integer> integers = Ints.asList(a);Collections.sort(integers);integers.toArray(new Integer[a.length]);}
