数据结构各种排序算法及其java程序实现

各种排序算法:冒择路(入)兮(稀)快归堆,桶式排序,基数排序

冒泡排序,选择排序,插入排序,稀尔排序,快速排序,归并排序,堆排序,桶式排序,基数排序

一、冒泡排序(BubbleSort)
1. 基本思想:
  两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
2. 排序过程:
  设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
【示例】:
49 13 13 13 13 13 13 13 
38 49 27 27 27 27 27 27
65 38 49 38 38 38 38 38
97 65 38 49 49 49 49 49
76 97 65 49 49 49 49 49
13 76 97 65 65 65 65 65
27 27 76 97 76 76 76 76
49 49 49 76 97 97 97 97

java代码实现:

[java]  view plain copy
  1. /** 
  2. * 冒泡排序:执行完一次内for循环后,最小的一个数放到了数组的最前面(跟那一个排序算法* 不一样)。相邻位置之间交换 
  3. */  
  4.   
  5. public class BubbleSort {     
  6.     
  7.     /**   
  8.      * 排序算法的实现,对数组中指定的元素进行排序   
  9.      * @param array 待排序的数组   
  10.      * @param from 从哪里开始排序   
  11.      * @param end 排到哪里   
  12.      * @param c 比较器   
  13.      */    
  14.     public void bubble(Integer[] array, int from, int end) {     
  15.         //需array.length - 1轮比较     
  16.         for (int k = 1; k < end - from + 1; k++) {     
  17.             //每轮循环中从最后一个元素开始向前起泡,直到i=k止,即i等于轮次止     
  18.             for (int i = end - from; i >= k; i--) {     
  19.                 //按照一种规则(后面元素不能小于前面元素)排序     
  20.                 if ((array[i].compareTo(array[i - 1])) < 0) {     
  21.                     //如果后面元素小于了(当然是大于还是小于要看比较器实现了)前面的元素,则前后交换     
  22.                     swap(array, i, i - 1);     
  23.                 }     
  24.             }     
  25.         }     
  26.     }     
  27.       
  28.     /**   
  29.      * 交换数组中的两个元素的位置   
  30.      * @param array 待交换的数组   
  31.      * @param i 第一个元素   
  32.      * @param j 第二个元素   
  33.      */    
  34.     public void swap(Integer[] array, int i, int j) {     
  35.         if (i != j) {//只有不是同一位置时才需交换     
  36.             Integer tmp = array[i];     
  37.             array[i] = array[j];     
  38.             array[j] = tmp;     
  39.         }     
  40.     }     
  41.   
  42.       
  43.     /**    
  44.     * 测试    
  45.     * @param args    
  46.     */    
  47.     public static void main(String[] args) {     
  48.         Integer[] intgArr = { 724312196851110 };     
  49.         BubbleSort bubblesort = new BubbleSort();     
  50.         bubblesort.bubble(intgArr,0,intgArr.length-1);  
  51.         for(Integer intObj:intgArr){  
  52.             System.out.print(intObj + " ");  
  53.         }  
  54.     }     
  55. }    

另外一种实现方式:

[java]  view plain copy
  1. /** 
  2. 冒泡排序:执行完一次内for循环后,最大的一个数放到了数组的最后面。相邻位置之间交换 
  3. */  
  4. public class BubbleSort2{  
  5.     public static void main(String[] args){  
  6.         int[] a = {3,5,9,4,7,8,6,1,2};  
  7.         BubbleSort2 bubble = new BubbleSort2();  
  8.         bubble.bubble(a);  
  9.         for(int num:a){  
  10.             System.out.print(num + " ");  
  11.         }  
  12.     }  
  13.       
  14.     public void bubble(int[] a){  
  15.         for(int i=a.length-1;i>0;i--){  
  16.             for(int j=0;j<i;j++){  
  17.                 if(new Integer(a[j]).compareTo(new Integer(a[j+1]))>0){  
  18.                     swap(a,j,j+1);  
  19.                 }  
  20.             }  
  21.         }  
  22.     }  
  23.       
  24.     public void swap(int[] a,int x,int y){  
  25.         int temp;  
  26.         temp=a[x];  
  27.         a[x]=a[y];  
  28.         a[y]=temp;  
  29.     }  
  30. }  




 

二、选择排序
1. 基本思想:
  每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
2. 排序过程:
【示例】:
  初始关键字 [49 38 65 97 76 13 27 49]
第一趟排序后 13 [38 65 97 76 49 27 49]
第二趟排序后 13 27 [65 97 76 49 38 49]
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [49 97 65 76]
第五趟排序后 13 27 38 49 49 [97 97 76]
第六趟排序后 13 27 38 49 49 76 [76 97]
第七趟排序后 13 27 38 49 49 76 76 [ 97]
最后排序结果 13 27 38 49 49 76 76 97

java代码实现:

[java]  view plain copy
  1. /** 
  2. * 简单选择排序:执行完一次内for循环后最小的一个数放在了数组的最前面。 
  3. */  
  4. public class SelectSort {     
  5.     
  6.     /**   
  7.      * 排序算法的实现,对数组中指定的元素进行排序   
  8.      * @param array 待排序的数组   
  9.      * @param from 从哪里开始排序   
  10.      * @param end 排到哪里   
  11.      * @param c 比较器   
  12.      */    
  13.     public void select(Integer[] array) {     
  14.         int minIndex;//最小索引     
  15.         /*   
  16.          * 循环整个数组(其实这里的上界为 array.length - 1 即可,因为当 i= array.length-1   
  17.          * 时,最后一个元素就已是最大的了,如果为array.length时,内层循环将不再循环),每轮假设   
  18.          * 第一个元素为最小元素,如果从第一元素后能选出比第一个元素更小元素,则让让最小元素与第一   
  19.          * 个元素交换    
  20.          */    
  21.         for (int i=0; i<array.length; i++) {     
  22.             minIndex = i;//假设每轮第一个元素为最小元素     
  23.             //从假设的最小元素的下一元素开始循环     
  24.             for (int j=i+1;j<array.length; j++) {     
  25.                 //如果发现有比当前array[smallIndex]更小元素,则记下该元素的索引于smallIndex中     
  26.                 if ((array[j].compareTo(array[minIndex])) < 0) {     
  27.                     minIndex = j;     
  28.                 }     
  29.             }     
  30.     
  31.             //先前只是记录最小元素索引,当最小元素索引确定后,再与每轮的第一个元素交换     
  32.             swap(array, i, minIndex);     
  33.         }     
  34.     }     
  35.       
  36.     public static void swap(Integer[] intgArr,int x,int y){  
  37.         //Integer temp; //这个也行  
  38.         int temp;  
  39.         temp=intgArr[x];  
  40.         intgArr[x]=intgArr[y];  
  41.         intgArr[y]=temp;  
  42.     }  
  43.       
  44.     /**   
  45.      * 测试   
  46.      * @param args   
  47.      */    
  48.     public static void main(String[] args) {     
  49.         Integer[] intgArr = { 5914263807 };     
  50.         SelectSort insertSort = new SelectSort();  
  51.         insertSort.select(intgArr);  
  52.         for(Integer intObj:intgArr){  
  53.             System.out.print(intObj + " ");  
  54.         }    
  55.           
  56.     }     
  57. }     



 

三、插入排序(Insertion Sort)
1. 基本思想:
  每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
2. 排序过程:  
【示例】:
[初始关键字] [49] 38 65 97 76 13 27 49
    J=2(38) [38 49] 65 97 76 13 27 49
    J=3(65) [38 49 65] 97 76 13 27 49
    J=4(97) [38 49 65 97] 76 13 27 49
    J=5(76) [38 49 65 76 97] 13 27 49
    J=6(13) [13 38 49 65 76 97] 27 49
    J=7(27) [13 27 38 49 65 76 97] 49
    J=8(49) [13 27 38 49 49 65 76 97] 

java代码实现:

[java]  view plain copy
  1. /** 
  2. * 直接插入排序: 
  3. * 注意所有排序都是从小到大排。 
  4. */  
  5.   
  6. public class InsertSort {     
  7.     
  8.     /**   
  9.      * 排序算法的实现,对数组中指定的元素进行排序   
  10.      * @param array 待排序的数组   
  11.      * @param from 从哪里开始排序   
  12.      * @param end 排到哪里   
  13.      * @param c 比较器   
  14.      */    
  15.     public void insert(Integer[] array, int from, int end) {     
  16.     
  17.         /*   
  18.          * 第一层循环:对待插入(排序)的元素进行循环   
  19.          * 从待排序数组断的第二个元素开始循环,到最后一个元素(包括)止   
  20.          */    
  21.         for (int i=from+1; i<=end; i++) {     
  22.             /*   
  23.              * 第二层循环:对有序数组进行循环,且从有序数组最第一个元素开始向后循环   
  24.              * 找到第一个大于待插入的元素   
  25.              * 有序数组初始元素只有一个,且为源数组的第一个元素,一个元素数组总是有序的   
  26.              */    
  27.             for (int j = 0; j < i; j++) {     
  28.                 Integer insertedElem = array[i];//待插入到有序数组的元素     
  29.                 //从有序数组中最一个元素开始查找第一个大于待插入的元素     
  30.                 if ((array[j].compareTo(insertedElem)) > 0) {     
  31.                     //找到插入点后,从插入点开始向后所有元素后移一位     
  32.                     move(array, j, i - 1);     
  33.                     //将待排序元素插入到有序数组中     
  34.                     array[j] = insertedElem;     
  35.                     break;     
  36.                 }     
  37.             }     
  38.         }  
  39.           
  40.         //=======以下是java.util.Arrays的插入排序算法的实现     
  41.         /*   
  42.          * 该算法看起来比较简洁一j点,有点像冒泡算法。   
  43.          * 将数组逻辑上分成前后两个集合,前面的集合是已经排序好序的元素,而后面集合为待排序的   
  44.          * 集合,每次内层循从后面集合中拿出一个元素,通过冒泡的形式,从前面集合最后一个元素开   
  45.          * 始往前比较,如果发现前面元素大于后面元素,则交换,否则循环退出   
  46.          *    
  47.          * 总感觉这种算术有点怪怪,既然是插入排序,应该是先找到插入点,而后再将待排序的元素插   
  48.          * 入到的插入点上,那么其他元素就必然向后移,感觉算法与排序名称不匹,但返过来与上面实   
  49.          * 现比,其实是一样的,只是上面先找插入点,待找到后一次性将大的元素向后移,而该算法却   
  50.          * 是走一步看一步,一步一步将待排序元素往前移   
  51.          */    
  52.         /*   
  53.         for (int i = from; i <= end; i++) {   
  54.             for (int j = i; j > from && c.compare(array[j - 1], array[j]) > 0; j--) {   
  55.                 swap(array, j, j - 1);   
  56.             }   
  57.         }   
  58.         */    
  59.     }     
  60.       
  61.       
  62.      /**   
  63.      * 数组元素后移   
  64.      * @param array 待移动的数组   
  65.      * @param startIndex 从哪个开始移   
  66.      * @param endIndex 到哪个元素止   
  67.      */    
  68.     public void move(Integer[] array, int startIndex, int endIndex) {     
  69.         for (int i = endIndex; i >= startIndex; i--) {     
  70.             array[i+1] = array[i];     
  71.         }     
  72.     }     
  73.   
  74.       
  75.     /**   
  76.      * 测试   
  77.      * @param args   
  78.      */    
  79.     public static void main(String[] args) {     
  80.         Integer[] intgArr = { 5914263807 };     
  81.         InsertSort insertSort = new InsertSort();     
  82.         insertSort.insert(intgArr,0,intgArr.length-1);  
  83.         for(Integer intObj:intgArr){  
  84.             System.out.print(intObj + " ");  
  85.         }  
  86.     }     
  87. }    

 

四、稀尔排序

java代码实现:

[java]  view plain copy
  1. /** 
  2. * 插入排序----希尔排序:我们选择步长为:15,7,3,1 
  3. * 我们选择步长公式为:2^k-1,2^(k-1)-1,……,15,7,3,1     (2^4-1,2^3-1,2^2-1,2^1-1) 
  4. * 注意所有排序都是从小到大排。 
  5. */  
  6. public class ShellSort {     
  7.     
  8.     /**   
  9.      * 排序算法的实现,对数组中指定的元素进行排序   
  10.      * @param array 待排序的数组   
  11.      * @param from 从哪里开始排序   
  12.      * @param end 排到哪里   
  13.      * @param c 比较器   
  14.      */    
  15.     public void sort(Integer[] array, int from, int end) {     
  16.         //初始步长,实质为每轮的分组数     
  17.         int step = initialStep(end - from + 1);     
  18.     
  19.         //第一层循环是对排序轮次进行循环。(step + 1) / 2 - 1 为下一轮步长值     
  20.         for (; step >= 1; step = (step + 1) / 2 - 1) {     
  21.             //对每轮里的每个分组进行循环     
  22.             for (int groupIndex = 0; groupIndex < step; groupIndex++) {     
  23.     
  24.                 //对每组进行直接插入排序     
  25.                 insertSort(array, groupIndex, step, end);     
  26.             }     
  27.         }     
  28.     }     
  29.     
  30.     /**   
  31.      * 直接插入排序实现   
  32.      * @param array 待排序数组   
  33.      * @param groupIndex 对每轮的哪一组进行排序   
  34.      * @param step 步长   
  35.      * @param end 整个数组要排哪个元素止   
  36.      * @param c 比较器   
  37.      */    
  38.     public void insertSort(Integer[] array, int groupIndex, int step, int end) {     
  39.         int startIndex = groupIndex;//从哪里开始排序     
  40.         int endIndex = startIndex;//排到哪里     
  41.         /*   
  42.          * 排到哪里需要计算得到,从开始排序元素开始,以step步长,可求得下元素是否在数组范围内,   
  43.          * 如果在数组范围内,则继续循环,直到索引超现数组范围   
  44.          */    
  45.         while ((endIndex + step) <= end) {     
  46.             endIndex += step;     
  47.         }     
  48.     
  49.         // i为每小组里的第二个元素开始     
  50.         for (int i = groupIndex + step; i <= end; i += step) {     
  51.             for (int j = groupIndex; j < i; j += step) {     
  52.                 Integer insertedElem = array[i];     
  53.                 //从有序数组中最一个元素开始查找第一个大于待插入的元素     
  54.                 if ((array[j].compareTo(insertedElem)) >= 0) {     
  55.                     //找到插入点后,从插入点开始向后所有元素后移一位     
  56.                     move(array, j, i - step, step);     
  57.                     array[j] = insertedElem;     
  58.                     break;     
  59.                 }     
  60.             }     
  61.         }     
  62.     }     
  63.     
  64.     /**   
  65.      * 根据数组长度求初始步长   
  66.      *    
  67.      * 我们选择步长的公式为:2^k-1,2^(k-1)-1,...,15,7,3,1 ,其中2^k 减一即为该步长序列,k   
  68.      * 为排序轮次   
  69.      *    
  70.      * 初始步长:step = 2^k-1    
  71.      * 初始步长约束条件:step < len - 1 初始步长的值要小于数组长度还要减一的值(因   
  72.      * 为第一轮分组时尽量不要分为一组,除非数组本身的长度就小于等于4)   
  73.      *    
  74.      * 由上面两个关系试可以得知:2^k - 1 < len - 1 关系式,其中k为轮次,如果把 2^k 表 达式   
  75.      * 转换成 step 表达式,则 2^k-1 可使用 (step + 1)*2-1 替换(因为 step+1 相当于第k-1   
  76.      * 轮的步长,所以在 step+1 基础上乘以 2 就相当于 2^k 了),即步长与数组长度的关系不等式为   
  77.      * (step + 1)*2 - 1 < len -1   
  78.      *    
  79.      * @param len 数组长度   
  80.      * @return   
  81.      */    
  82.     public static int initialStep(int len) {     
  83.         /*   
  84.          * 初始值设置为步长公式中的最小步长,从最小步长推导出最长初始步长值,即按照以下公式来推:   
  85.          * 1,3,7,15,...,2^(k-1)-1,2^k-1   
  86.          * 如果数组长度小于等于4时,步长为1,即长度小于等于4的数组不用分组,此时直接退化为直接插入排序   
  87.          */    
  88.         int step = 1;     
  89.     
  90.         //试探下一个步长是否满足条件,如果满足条件,则步长置为下一步长     
  91.         while ((step + 1) * 2 - 1 < len - 1) {     
  92.             step = (step + 1) * 2 - 1;     
  93.         }     
  94.     
  95.         System.out.println("初始步长 : " + step);     
  96.         return step;     
  97.     }     
  98.       
  99.     /**   
  100.      * 以指定的步长将数组元素后移,步长指定每个元素间的间隔   
  101.      * @param array 待排序数组   
  102.      * @param startIndex 从哪里开始移   
  103.      * @param endIndex 到哪个元素止   
  104.      * @param step 步长   
  105.      */    
  106.     protected final void move(Integer[] array, int startIndex, int endIndex, int step)  {     
  107.         for (int i = endIndex; i >= startIndex; i -= step) {     
  108.             array[i + step] = array[i];     
  109.         }     
  110.     }     
  111.   
  112.       
  113.     /**   
  114.      * 测试   
  115.      * @param args   
  116.      */    
  117.     public static void main(String[] args) {     
  118.         Integer[] intgArr = { 5914826370 };     
  119.         ShellSort shellSort = new ShellSort();     
  120.         shellSort.sort(intgArr,0,intgArr.length-1);  
  121.         for(Integer intObj:intgArr){  
  122.             System.out.print(intObj + " ");  
  123.         }  
  124.     }     
  125. }     



 

五、快速排序(Quick Sort)
1. 基本思想:
  在当前无序区R[1..H]中任取一个数据元素作为比较的"基准"(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R[1..I-1]和R[I+1..H],且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R[1..I-1]≤X.Key≤R[I+1..H](1≤I≤H),当R[1..I-1]和R[I+1..H]均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。
2. 排序过程:
【示例】:

初始关键字 [49 38 65 97 76 13 27 49]
一趟排序之后 [27 38 13] 49 [76 97 65 49] 
二趟排序之后 [13] 27 [38] 49 [49 65]76 [97]
三趟排序之后 13 27 38 49 49 [65]76 97
最后的排序结果 13 27 38 49 49 65 76 97 
各趟排序之后的状态

java代码实现:

[java]  view plain copy
  1. /** 
  2. * 快速排序: 
  3. */  
  4.   
  5. public class QuickSort {     
  6.     
  7.     /**   
  8.      * 排序算法的实现,对数组中指定的元素进行排序   
  9.      * @param array 待排序的数组   
  10.      * @param from 从哪里开始排序   
  11.      * @param end 排到哪里   
  12.      * @param c 比较器   
  13.      */    
  14.     //定义了一个这样的公有方法sort,在这个方法体里面执行私有方法quckSort(这种方式值得借鉴)。  
  15.     public void sort(Integer[] array, int from, int end) {     
  16.         quickSort(array, from, end);     
  17.     }     
  18.     
  19.     /**   
  20.      * 递归快速排序实现   
  21.      * @param array 待排序数组   
  22.      * @param low 低指针   
  23.      * @param high 高指针   
  24.      * @param c 比较器   
  25.      */    
  26.     private void quickSort(Integer[] array, int low, int high) {     
  27.         /*   
  28.          * 如果分区中的低指针小于高指针时循环;如果low=higth说明数组只有一个元素,无需再处理;   
  29.          * 如果low > higth,则说明上次枢纽元素的位置pivot就是low或者是higth,此种情况   
  30.          * 下分区不存,也不需处理   
  31.          */    
  32.         if (low < high) {     
  33.             //对分区进行排序整理     
  34.               
  35.             //int pivot = partition1(array, low, high);  
  36.             int pivot = partition2(array, low, high);     
  37.             //int pivot = partition3(array, low, high);        
  38.               
  39.             /*   
  40.              * 以pivot为边界,把数组分成三部分[low, pivot - 1]、[pivot]、[pivot + 1, high]   
  41.              * 其中[pivot]为枢纽元素,不需处理,再对[low, pivot - 1]与[pivot + 1, high]   
  42.              * 各自进行分区排序整理与进一步分区   
  43.              */    
  44.             quickSort(array, low, pivot - 1);     
  45.             quickSort(array, pivot + 1, high);     
  46.         }     
  47.     
  48.     }     
  49.     
  50.     /**   
  51.      * 实现一   
  52.      *    
  53.      * @param array 待排序数组   
  54.      * @param low 低指针   
  55.      * @param high 高指针   
  56.      * @param c 比较器   
  57.      * @return int 调整后中枢位置   
  58.      */    
  59.     private int partition1(Integer[] array, int low, int high) {     
  60.         Integer pivotElem = array[low];//以第一个元素为中枢元素     
  61.         //从前向后依次指向比中枢元素小的元素,刚开始时指向中枢,也是小于与大小中枢的元素的分界点     
  62.         int border = low;     
  63.     
  64.         /*   
  65.          * 在中枢元素后面的元素中查找小于中枢元素的所有元素,并依次从第二个位置从前往后存放   
  66.          * 注,这里最好使用i来移动,如果直接移动low的话,最后不知道数组的边界了,但后面需要   
  67.          * 知道数组的边界   
  68.          */    
  69.         for (int i = low + 1; i <= high; i++) {     
  70.             //如果找到一个比中枢元素小的元素     
  71.             if ((array[i].compareTo(pivotElem)) < 0) {     
  72.                 swap(array, ++border, i);//border前移,表示有小于中枢元素的元素     
  73.             }     
  74.         }     
  75.         /*   
  76.          * 如果border没有移动时说明说明后面的元素都比中枢元素要大,border与low相等,此时是   
  77.          * 同一位置交换,是否交换都没关系;当border移到了high时说明所有元素都小于中枢元素,此   
  78.          * 时将中枢元素与最后一个元素交换即可,即low与high进行交换,大的中枢元素移到了 序列最   
  79.          * 后;如果 low <minIndex< high,表 明中枢后面的元素前部分小于中枢元素,而后部分大于   
  80.          * 中枢元素,此时中枢元素与前部分数组中最后一个小于它的元素交换位置,使得中枢元素放置在   
  81.          * 正确的位置   
  82.          */    
  83.         swap(array, border, low);     
  84.         return border;     
  85.     }     
  86.     
  87.     /**   
  88.      * 实现二   
  89.      *    
  90.      * @param array 待排序数组   
  91.      * @param low 待排序区低指针   
  92.      * @param high 待排序区高指针   
  93.      * @param c 比较器   
  94.      * @return int 调整后中枢位置   
  95.      */    
  96.     private int partition2(Integer[] array, int low, int high) {     
  97.         int pivot = low;//中枢元素位置,我们以第一个元素为中枢元素     
  98.         //退出条件这里只可能是 low = high     
  99.         while (true) {     
  100.             if (pivot != high) {//如果中枢元素在低指针位置时,我们移动高指针     
  101.                 //如果高指针元素小于中枢元素时,则与中枢元素交换     
  102.                 if ((array[high].compareTo(array[pivot])) < 0) {     
  103.                     swap(array, high, pivot);     
  104.                     //交换后中枢元素在高指针位置了     
  105.                     pivot = high;     
  106.                 } else {//如果未找到小于中枢元素,则高指针前移继续找     
  107.                     high--;     
  108.                 }     
  109.             } else {//否则中枢元素在高指针位置     
  110.                 //如果低指针元素大于中枢元素时,则与中枢元素交换     
  111.                 if ((array[low].compareTo(array[pivot])) > 0) {     
  112.                     swap(array, low, pivot);     
  113.                     //交换后中枢元素在低指针位置了     
  114.                     pivot = low;     
  115.                 } else {//如果未找到大于中枢元素,则低指针后移继续找     
  116.                     low++;     
  117.                 }     
  118.             }     
  119.             if (low == high) {     
  120.                 break;     
  121.             }     
  122.         }     
  123.         //返回中枢元素所在位置,以便下次分区     
  124.         return pivot;     
  125.     }     
  126.     
  127.     /**   
  128.      * 实现三   
  129.      *    
  130.      * @param array 待排序数组   
  131.      * @param low 待排序区低指针   
  132.      * @param high 待排序区高指针   
  133.      * @param c 比较器   
  134.      * @return int 调整后中枢位置   
  135.      */    
  136.     private int partition3(Integer[] array, int low, int high) {     
  137.         int pivot = low;//中枢元素位置,我们以第一个元素为中枢元素     
  138.         low++;     
  139.         //----调整高低指针所指向的元素顺序,把小于中枢元素的移到前部分,大于中枢元素的移到后面部分     
  140.         //退出条件这里只可能是 low = high     
  141.     
  142.         while (true) {     
  143.             //如果高指针未超出低指针     
  144.             while (low < high) {     
  145.                 //如果低指针指向的元素大于或等于中枢元素时表示找到了,退出,注:等于时也要后移     
  146.                 if ((array[low].compareTo(array[pivot])) >= 0) {     
  147.                     break;     
  148.                 } else {//如果低指针指向的元素小于中枢元素时继续找     
  149.                     low++;     
  150.                 }     
  151.             }     
  152.     
  153.             while (high > low) {     
  154.                 //如果高指针指向的元素小于中枢元素时表示找到,退出     
  155.                 if ((array[high].compareTo(array[pivot])) < 0) {     
  156.                     break;     
  157.                 } else {//如果高指针指向的元素大于中枢元素时继续找     
  158.                     high--;     
  159.                 }     
  160.             }     
  161.             //退出上面循环时 low = high     
  162.             if (low == high) {     
  163.                 break;     
  164.             }     
  165.     
  166.             swap(array, low, high);     
  167.         }     
  168.     
  169.         //----高低指针所指向的元素排序完成后,还得要把中枢元素放到适当的位置     
  170.         if ((array[pivot].compareTo(array[low])) > 0) {     
  171.             //如果退出循环时中枢元素大于了低指针或高指针元素时,中枢元素需与low元素交换     
  172.             swap(array, low, pivot);     
  173.             pivot = low;     
  174.         } else if ((array[pivot].compareTo(array[low])) <= 0) {     
  175.             swap(array, low - 1, pivot);     
  176.             pivot = low - 1;     
  177.         }     
  178.     
  179.         //返回中枢元素所在位置,以便下次分区     
  180.         return pivot;     
  181.     }     
  182.       
  183.         /**   
  184.      * 交换数组中的两个元素的位置   
  185.      * @param array 待交换的数组   
  186.      * @param i 第一个元素   
  187.      * @param j 第二个元素   
  188.      */    
  189.     public void swap(Integer[] array, int i, int j) {     
  190.         if (i != j) {//只有不是同一位置时才需交换     
  191.             Integer tmp = array[i];     
  192.             array[i] = array[j];     
  193.             array[j] = tmp;     
  194.         }     
  195.     }   
  196.       
  197.     /**    
  198.     * 测试    
  199.     * @param args    
  200.     */    
  201.     public static void main(String[] args) {     
  202.         Integer[] intgArr = { 5914263807 };    
  203.         QuickSort quicksort = new QuickSort();     
  204.         quicksort.sort(intgArr,0,intgArr.length-1);  
  205.         for(Integer intObj:intgArr){  
  206.             System.out.print(intObj + " ");  
  207.         }  
  208.     }     
  209. }     

 

六、归并排序

java代码实现:

[java]  view plain copy
  1. /** 
  2. 归并排序:里面是一个递归程序,深刻理解之。 
  3. */  
  4. public class MergeSort{     
  5.     
  6.     /**   
  7.      * 递归划分数组   
  8.      * @param arr   
  9.      * @param from   
  10.      * @param end   
  11.      * @param c void   
  12.      */    
  13.     public void partition(Integer[] arr, int from, int end) {     
  14.         

你可能感兴趣的:(java,数据结构,算法,Integer,存储,PIVOT)