几种常见的排序算法集锦

排序算法有很多,下面只是列举了几种常见的.

首先定义一个用于交换数组中2个值的方法

1 //用于交换的方法
2 public static void swap(Integer[] arr,int a,int b){
3      int temp;
4      temp = arr[a];
5      arr[a] = arr[b];
6      arr[b] = temp;
7 }

冒泡排序   O(n^2)

 1     public static void sort(Integer[] a){
 2         for (int i=0;i<a.length;i++) {
 3 
 4             Boolean flag = true;
 5 
 6             for (int j=a.length-2;j>=i;j--){
 7 
 8                 if (a[j]>a[j+1]){
 9                     swap(a,j,j+1);
10                     flag = false;
11                 }
12             }
13 
14             if (flag){
15                 //数组已经有序
16                 return ;
17             }
18         }
19     }

简单选择排序  O(n^2)

 1     public static void sort(Integer[] arr){
 2 
 3         for (int i=0;i<arr.length;i++){
 4             int min = i;
 5             for (int j=i+1;j<arr.length;j++){
 6                 if (arr[j]<arr[min]){
 7                     min = j;
 8                 }
 9             }
10             if (min != i){
11                 swap(arr,i,min);
12             }
13         }
14 
15     }

直接插入排序  O(n^2)

 1     public static void sort(Integer[] arr){
 2         for(int i=1;i<arr.length;i++){
 3             if (arr[i]<arr[i-1]){
 4                int temp = arr[i];
 5                int j;
 6                 for (j=i-1;j>=0 && arr[j]>temp;j--){
 7                     arr[j+1] = arr[j];
 8                 }
 9                 arr[j+1] = temp;
10             }
11         }
12     }

希尔排序   O(nlog(n))~ O(n^2)   不稳定

 1     public static void sort(Integer arr[]){
 2         //增量,每次分组的间隔
 3         int increment = arr.length;
 4         //临时变量
 5         int temp;
 6         int j;
 7         while (increment>1){
 8             increment = increment / 3 +1;
 9             for (int i= 0;i<arr.length;i=i+increment){
10                 temp = arr[i];
11                 for (j=i-increment;j>=0&&arr[j]>temp;j=j-increment){
12                     arr[j+increment] = arr[j];
13                 }
14                 arr[j+increment] = temp;
15             }
16         }
17     }

快速排序    O(nlog(n))~ O(n^2)   不稳定

 1     public static void sort(Integer[] arr,int left,int right){
 2         int i,j,temp,t;
 3         if(left>right){
 4             return ;
 5         }
 6         i=left;
 7         j=right;
 8         //temp就是基准位
 9         temp = arr[left];
10         while (i<j) {
11             //先看右边,依次往左递减
12             while (temp<=arr[j]&&i<j) {
13                 j--;
14             }
15             //再看左边,依次往右递增
16             while (temp>=arr[i]&&i<j) {
17                 i++;
18             }
19             //如果满足条件则交换
20             if (i<j) {
21                 t = arr[j];
22                 arr[j] = arr[i];
23                 arr[i] = t;
24             }
25         }
26         //最后将基准为与i和j相等位置的数字交换
27         arr[left] = arr[i];
28         arr[i] = temp;
29         //递归调用左半数组
30         sort(arr, left, j-1);
31         //递归调用右半数组
32         sort(arr, j+1, right);
33     }

用下面这段代码做测试,每个算法的大概时间(因个人电脑差异,数据可能有差异)

 1         Integer arr[] = new Integer[10000];
 2         for (int i =0;i<arr.length;i++){
 3             arr[i]= new Random().nextInt();
 4         }
 5         Long start = System.currentTimeMillis();
 6         sort(arr,0,arr.length-1);
 7         Long end = System.currentTimeMillis();
 8         System.out.println(start);
 9         System.out.println(end);
10         System.out.println("运行时间为----"+(end-start));
11         for (Integer i:arr) {
12             System.out.print(i+" ");
13         }

冒泡算法:430~550ms

简单选择排序:105~180ms

直接插入排序:55~80ms

希尔排序:40~60ms

快速排序:5~10ms

 

 

posted @ 2019-11-22 10:29  使*者  阅读(328)  评论(0编辑  收藏  举报