分别对1k,1w,10w,20w大小的随机数组排序
得到综合结果是:
速度: 快速排序>>归并排序>>>>>插入排序>>选择排序>>冒泡排序

1,插入排序

先找待插入数字,然后提出来,与前面有序的数列对比,看比谁小就放在谁前面
image.png

  1. public class InsertSort {
  2. public static void sort(int[] arr) {
  3. if (arr.length >= 2) {
  4. for (int i = 1; i < arr.length; i++) {
  5. //挖出一个要用来插入的值,同时位置上留下一个可以存新的值的坑
  6. int x = arr[i];
  7. int j = i - 1;
  8. //在前面有一个或连续多个值比x大的时候,一直循环往前面找,将x插入到这串值前面
  9. while (j >= 0 && arr[j] > x) {
  10. //当arr[j]比x大的时候,将j向后移一位,正好填到坑中
  11. arr[j + 1] = arr[j];
  12. j--;
  13. }
  14. //将x插入到最前面
  15. arr[j + 1] = x;
  16. }
  17. }
  18. }
  19. }

2,快速排序法

  1. public class QuickSort {
  2. public static void sort(int[] arr,int begin,int end) {
  3. //先定义两个参数接收排序起始值和结束值
  4. int a = begin;
  5. int b = end;
  6. //先判断a是否大于b
  7. if (a >= b) {
  8. //没必要排序
  9. return;
  10. }
  11. //基准数,默认设置为第一个值
  12. int x = arr[a];
  13. //循环
  14. while (a < b) {
  15. //从后往前找,找到一个比基准数x小的值,赋给arr[a]
  16. //如果a和b的逻辑正确--a<b ,并且最后一个值arr[b]>x,就一直往下找,直到找到后面的值大于x
  17. while (a < b && arr[b] >= x) {
  18. b--;
  19. }
  20. //跳出循环,两种情况,一是a和b的逻辑不对了,a>=b,这时候排序结束.二是在后面找到了比x小的值
  21. if (a < b) {
  22. //将这时候找到的arr[b]放到最前面arr[a]
  23. arr[a] = arr[b];
  24. //排序的起始位置后移一位
  25. a++;
  26. }
  27. //从前往后找,找到一个比基准数x大的值,放在最后面arr[b]
  28. while (a < b && arr[a] <= x) {
  29. a++;
  30. }
  31. if (a < b) {
  32. arr[b] = arr[a];
  33. //排序的终止位置前移一位
  34. b--;
  35. }
  36. }
  37. //跳出循环 a < b的逻辑不成立了,a==b重合了,此时将x赋值回去arr[a]
  38. arr[a] = x;
  39. //调用递归函数,再细分再排序
  40. sort(arr,begin,a-1);
  41. sort(arr,a+1,end);
  42. }
  43. }

3,冒泡排序

跟前面的比较,小的往前

  1. public class MaoPao {
  2. public static void sort(int[] arr){
  3. for (int i = 1; i < arr.length; i++) { //第一层for循环,用来控制冒泡的次数
  4. for (int j = 0; j < arr.length-1; j++) { //第二层for循环,用来控制冒泡一层层到最后
  5. //如果前一个数比后一个数大,两者调换 ,意味着泡泡向上走了一层
  6. if (arr[j] > arr[j+1] ){
  7. int temp = arr[j];
  8. arr[j] = arr[j+1];
  9. arr[j+1] = temp;
  10. }
  11. }
  12. }
  13. }
  14. }

在这个版本中,改动了两点
第一点是加入了一个布尔值,判断第二层循环中的调换有没有执行,如果没有进行两两调换,说明后面都已经排好序了,已经不需要再循环了,直接跳出循环,排序结束.
第二点是第二层循环不再循环到arr.length - 1,因为外面的i循环递增一次,说明数组最后就多了一个排好序的大泡泡.第二层循环也就不需要到最末尾一位了,可以提前结束循环

  1. /**
  2. * 终极版冒泡排序
  3. * 加入一个布尔变量,如果内循环没有交换值,说明已经排序完成,提前终止
  4. * @param arr
  5. */
  6. public static void sortPlus(int[] arr){
  7. if(arr != null && arr.length > 1){
  8. for(int i = 0; i < arr.length - 1; i++){
  9. // 初始化一个布尔值
  10. boolean flag = true;
  11. for(int j = 0; j < arr.length - i - 1 ; j++){
  12. if(arr[j] > arr[j+1]){
  13. // 调换
  14. int temp;
  15. temp = arr[j];
  16. arr[j] = arr[j+1];
  17. arr[j+1] = temp;
  18. // 改变flag
  19. flag = false;
  20. }
  21. }
  22. if(flag){
  23. break;
  24. }
  25. }
  26. }
  27. }

4,选择排序

首先在未排序数列中找到最小元素,然后将其与数列的首部元素进行交换,然后循环找 ,放在最前面
image.png

  1. public static void sort(int[] arr){
  2. for(int i = 0; i < arr.length - 1 ; i++){
  3. int min = i; // 遍历的区间最小的值
  4. for (int j = i + 1; j < arr.length ;j++){
  5. if(arr[j] < arr[min]){
  6. // 找到当前遍历区间最小的值的索引
  7. min = j;
  8. }
  9. }
  10. if(min != i){
  11. // 发生了调换
  12. int temp = arr[min];
  13. arr[min] = arr[i];
  14. arr[i] = temp;
  15. }
  16. }
  17. }

5,归并排序

归并排序,分成两个数一组,排序,然后合起来 ,合并的规则是将其按从小到大的顺序放到一个临时数组中,再把这个临时数组替换原数组相应位置,
image.png

  1. public static void mergeSort(int[] a,int s,int e){
  2. int m = (s + e) / 2;
  3. if (s < e){
  4. mergeSort(a,s,m);
  5. mergeSort(a,m+1,e);
  6. //归并
  7. merge(a,s,m,e);
  8. }
  9. }
  10. private static void merge(int[] a, int s, int m, int e) {
  11. //初始化一个从起始s到终止e的一个数组
  12. int[] temp = new int[(e - s) + 1];
  13. //左起始指针
  14. int l = s;
  15. //右起始指针
  16. int r = m+1;
  17. int i = 0;
  18. //将s-e这段数据在逻辑上一分为二,l-m为一个左边的数组,r-e为一个右边的数组,两边都是有序的
  19. //从两边的第一个指针开始遍历,将其中小的那个值放在temp数组中
  20. while (l <= m && r <= e){
  21. if (a[l] < a[r]){
  22. temp[i++] = a[l++];
  23. }else{
  24. temp[i++] = a[r++];
  25. }
  26. }
  27. //将两个数组剩余的数放到temp中
  28. while (l <= m){
  29. temp[i++] = a[l++];
  30. }
  31. while (r <= e){
  32. temp[i++] = a[r++];
  33. }
  34. //将temp数组覆盖原数组
  35. for (int n = 0; n < temp.length; n++) {
  36. a[s+n] = temp[n];
  37. }
  38. }

6,Arrays.sort()

Arrays工具类提供的排序方法。它内部实现也是快速排序

  1. private static void arraysSort(int[] a){
  2. Arrays.sort(a);
  3. }

7,Collections.sort()

将数组转为list,使用集合的排序方法,但是这无异于兜圈子,因为集合底层也是数组

  1. private static void listSort(int[] a){
  2. List<Integer> integers = Ints.asList(a);
  3. Collections.sort(integers);
  4. integers.toArray(new Integer[a.length]);
  5. }