JAVA排序算法实现和比较:冒泡,桶,选择,快排,归并

一。冒泡排序:

实现思想:

重复地走访过要排序的元素列,一次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

代码:

 1 package NumSort;
 2 
 3 //冒泡排序
 4 public class BubbleSort {
 5     public static void main(String[] args){
 6         int num[] ={23,1,56,78,5,43,34,34,78,9,99};
 7         int n = num.length;
 8         int temp;
 9         for(int i=0;i<n;i++){
10             for(int j=0;j<n-1-i;j++){
11                 if(num[j]>num[j+1]){
12                     temp = num[j+1];
13                     num[j+1] = num[j];
14                     num[j] = temp;
15                 }
16             }
17         }
18         for(int i=0;i<n;i++){
19             System.out.print(num[i]+" ");
20         }
21     }
22 }

 

二。桶排序:

实现思想:

桶排序 (Bucket sort)或所谓的箱排序,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序。

代码:

 1 package NumSort;
 2 
 3 //桶排序
 4 public class BucketSort {
 5     public static void main(String[] args){
 6         int num[] ={23,1,56,78,5,43,34,34,78,9,99};
 7         int[] a = new int[100];
 8         for(int i=0;i<100;i++){
 9             a[i] = 0;
10         }
11         for(int i=0;i<num.length;i++){
12             a[num[i]] += 1;
13         }
14         for(int i=0;i<100;i++){
15             if(a[i]>0){
16                 for(int j=0;j<a[i];j++){
17                     System.out.print(i+" ");
18                 }
19             }
20         }
21     }
22 }

 

三。选择排序:

实现思想:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

代码:

 1 package NumSort;
 2 
 3 //选择排序
 4 public class SelectSort {
 5     public static void main(String[] args){
 6         int num[] ={23,1,56,78,5,43,34,34,78,9,99};
 7         int n = num.length;
 8         int temp;
 9         for(int i=0;i<n;i++){
10             for(int j=i+1;j<n;j++){
11                 if(num[i]>num[j]){
12                     temp = num[i];
13                     num[i] = num[j];
14                     num[j] = temp;
15                 }
16             }
17         }
18         for(int i=0;i<n;i++){
19             System.out.print(num[i]+" ");
20         }
21     }
22 }

 

四。快速排序:

实现思想:

通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

代码:

 1 package NumSort;
 2 
 3 import java.util.Arrays;
 4 
 5 public class QuickSort2 {
 6     public static void main(String[] args){
 7         int num[] = {23,5,67,98,76,2,1,5,65,23,34};
 8         quickS(num,0,num.length-1);
 9         System.out.println(Arrays.toString(num));
10     }
11     public static void quickS(int num[],int left,int right){
12         int i = left;
13         int j = right;
14         int temp;
15         int middle = num[left];
16         if(left>=right){
17             return;
18         }
19         while(i!=j){
20             while(num[j]>middle&&i<j){
21                 j--;
22             }
23             if(i<j){
24                 temp = num[i];
25                 num[i] = num[j];
26                 num[j] = temp;
27                 i++;
28             }
29             while(num[i]<middle&&i<j){
30                 i++;
31             }
32             if(i<j){
33                 temp = num[i];
34                 num[i] = num[j];
35                 num[j] = temp;
36                 j--;
37             }
38         }
39         quickS(num,left,i-1);
40         quickS(num,i+1,right);
41     }
42 }

 

五。归并排序:

实现思想:

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

代码:

 1 package NumSort;
 2 
 3 import java.util.Arrays;
 4 
 5 public class MergeSort {
 6     public static void main(String[] args){
 7         int num[] = {34,5,23,123,8,76,98,65,34,65,99};
 8         MergeS(num,0,num.length-1);
 9         System.out.println(Arrays.toString(num));
10     }
11     public static void Merge(int num[],int low,int middle,int high){
12         int i = low;
13         int j = middle+1;
14         int k = 0;
15         int B[] = new int[high-low+1];
16         while(i<=middle&&j<=high){
17             if(num[i]<=num[j]){
18                 B[k] = num[i];
19                 k++;
20                 i++;
21             }
22             else{
23                 B[k] = num[j];
24                 k++;
25                 j++;
26             }
27         }
28         while(i<=middle){
29             B[k++] = num[i++];
30         }
31         while(j<=high){
32             B[k++] = num[j++];
33         }
34         //System.arraycopy(B, 0, num, 0, num.length);
35         for(int l=0;l<B.length;l++){
36             num[low+l] = B[l];
37         }
38     }
39     public static void MergeS(int num[],int low,int high){
40         int middle = (low+high)/2;
41         if(low<high){
42             MergeS(num,low,middle);
43             MergeS(num,middle+1,high);
44             Merge(num,low,middle,high);
45         }
46     }
47 }

 

六。希尔排序:

先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量 =1( <  …<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

七。堆排序:

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

八。基数排序:

第一步(来自百度百科)

以LSD为例,假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39

第二步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93

第三步

接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

九。各排序算法比较:

图片来自网络:

 

posted @ 2018-08-23 10:48  fanghuiX  阅读(296)  评论(0编辑  收藏  举报