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]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
八。基数排序:
第一步(来自百度百科)
第二步
第三步
九。各排序算法比较:
图片来自网络: