冒泡,快速,希尔,拓扑,归并 排序算法整合

冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序 。
它是一种较简单的排序算法 。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置 。这样,一次遍历之后,最大的元素就在数列的末尾!采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前 。重复此操作,直到整个数列都有序为止!
冒泡排序图文说明

冒泡,快速,希尔,拓扑,归并 排序算法整合

文章插图
 
 
/* * a -- 待排序的数组 * n -- 数组的长度 */ public static void bubbleSort(int[] a, int n) { int i,j; for (i=n-1; i>0; i--) { // 将a[0...i]中最大的数据放在末尾 for (j=0; j<i; j++) { if (a[j] > a[j+1]) { // 交换a[j]和a[j+1] int tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } }运行:
int[] a = {20,40,30,10,60,50,70}; String aa = "冒泡排序"; bubbleSort(a,a.length); System.out.print(aa); for (int d : a) { System.out.print(d+",");} 
快速排序介绍
快速排序(Quick Sort)使用分治法策略 。
它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小 。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 。
快速排序流程:
  1. 从数列中挑出一个基准值 。
  2. 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置 。
  3. 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序 。
  4. 图文介绍

冒泡,快速,希尔,拓扑,归并 排序算法整合

文章插图
 
  1.  
代码实现:
/** * * 参数说明: * a -- 待排序的数组 * l -- 数组的左边界(例如,从起始位置开始排序,则l=0) * r -- 数组的右边界(例如,排序截至到数组末尾,则r=a.length-1) */ public static void quickSort(int[] a, int l, int r) { if (l < r) { int i,j,x; i = l; j = r; x = a[i]; while (i < j) { while(i < j && a[j] > x) j--; // 从右向左找第一个小于x的数 if(i < j) a[i++] = a[j]; while(i < j && a[i] < x) i++; // 从左向右找第一个大于x的数 if(i < j) a[j--] = a[i]; } a[i] = x; quickSort(a, l, i-1); /* 递归调用 */ quickSort(a, i+1, r); /* 递归调用 */ } }运行:
String aa = "快速排序"; quickSort(a,0,a.length-1); System.out.print(aa); for (int d : a) { System.out.print(d+","); } 
直接插入排序介绍
直接插入排序(Straight Insertion Sort)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表 。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程 。
直接插入排序图文说明
冒泡,快速,希尔,拓扑,归并 排序算法整合

文章插图
 
 
代码实现:
/** * @param* a -- 待排序的数组 * n -- 数组的长度 */ public static void insertSort(int[] a, int n) { int i, j, k; for (i = 1; i < n; i++) { //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 for (j = i - 1; j >= 0; j--) if (a[j] < a[i]) break; //如找到了一个合适的位置 if (j != i - 1) { //将比a[i]大的数据向后移 int temp = a[i]; for (k = i - 1; k > j; k--) a[k + 1] = a[k]; //将a[i]放到正确位置上 a[k + 1] = temp; } } } 
运行和冒泡一样 。。。。。
希尔排序:
希尔(Shell)排序又称为缩小增量排序,它是一种插入排序 。它是直接插入排序算法的一种威力加强版 。该方法因DL.Shell于1959年提出而得名 。
希尔排序的基本思想是:
把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序 。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序 。
我们来通过演示图,更深入的理解一下这个过程 。
冒泡,快速,希尔,拓扑,归并 排序算法整合

文章插图
 
 
在上面这幅图中:
初始时,有一个大小为 10 的无序序列 。
在第一趟排序中,我们不妨设 gap1 = N / 2 = 5,即相隔距离为 5 的元素组成一组,可以分为 5 组 。接下来,按照直接插入排序的方法对每个组进行排序 。


推荐阅读