快速排序(Quicktsort)之Java实现

来源:互联网 发布:云创客淘宝采集软件 编辑:程序博客网 时间:2024/06/05 05:29

快速排序算法介绍

快速排序和归并排序都使用分治法来设计算法,区别在于归并排序把数组分为两个基本等长的子数组,分别排好序之后还要进行归并(Merge)操作,而快速排序拆分子数组的时候显得更有艺术,取一个基准元素拆分之后基准元素左边的元素都比基准元素小,右边的元素都不小于基准元素,这样只需要分别对两个子数组排序即可,不再像归并排序一样需要归并操作。基准元素的选取对算法的效率影响很大,最好的情况是两个子数组大小基本相当。为简单起见,我们选择最后一个元素,更高级的做法可以先找一个中位数并把中位数与最后一个元素交换,之后再进行相同的操作步骤。拆分是快速排序的核心。快速排序的最坏运行时间是O(n2),但期望的运行时间是O(nlgn)。

快速排序算法Java实现

  1. 把数组拆分为两个子数组加上一个基准元素: 选取最后一个元素作为基准元素,index变量记录最近一个小于基准元素的元素所在的位置,初始化为start- 1,发现新的小于基准元素的元素,index加1。从第一个元素到倒数第二个元素,依次与基准元素比较,小于基准元素,index加1,交换位置index和当前位置的元素。循环结束之后index+1得到基准元素应该在的位置,交换index+1和最后一个元素。
  2. 分别排序[start, index], 和[index+2, end]两个子数组

如《插入排序(Insertsort)之Java实现》一样,先实现一个数组工具类。代码如下:

[java] view plain copy
  1. public class ArrayUtils {  
  2.       
  3.         public static void printArray(int[] array) {  
  4.             System.out.print("{");  
  5.             for (int i = 0; i < array.length; i++) {  
  6.                 System.out.print(array[i]);  
  7.                 if (i < array.length - 1) {  
  8.                     System.out.print(", ");  
  9.                 }  
  10.             }  
  11.             System.out.println("}");  
  12.         }  
  13.   
  14.         public static void exchangeElements(int[] array, int index1, int index2) {  
  15.             int temp = array[index1];  
  16.             array[index1] = array[index2];  
  17.             array[index2] = temp;  
  18.         }  
  19.     }  

快速排序的Java实现以及测试代码如下:

[java] view plain copy
  1. public class QuickSort {  
  2.   
  3.     public static void main(String[] args) {  
  4.         int[] array = { 9876543210, -1, -2, -3 };  
  5.   
  6.         System.out.println("Before sort:");  
  7.         ArrayUtils.printArray(array);  
  8.   
  9.         quickSort(array);  
  10.   
  11.         System.out.println("After sort:");  
  12.         ArrayUtils.printArray(array);  
  13.     }  
  14.   
  15.     public static void quickSort(int[] array) {  
  16.         subQuickSort(array, 0, array.length - 1);  
  17.     }  
  18.   
  19.     private static void subQuickSort(int[] array, int start, int end) {  
  20.         if (array == null || (end - start + 1) < 2) {  
  21.             return;  
  22.         }  
  23.   
  24.         int part = partition(array, start, end);  
  25.   
  26.         if (part == start) {  
  27.             subQuickSort(array, part + 1, end);  
  28.         } else if (part == end) {  
  29.             subQuickSort(array, start, part - 1);  
  30.         } else {  
  31.             subQuickSort(array, start, part - 1);  
  32.             subQuickSort(array, part + 1, end);  
  33.         }  
  34.     }  
  35.   
  36.     private static int partition(int[] array, int start, int end) {  
  37.         int value = array[end];  
  38.         int index = start - 1;  
  39.   
  40.         for (int i = start; i < end; i++) {  
  41.             if (array[i] < value) {  
  42.                 index++;  
  43.                 if (index != i) {  
  44.                     ArrayUtils.exchangeElements(array, index, i);  
  45.                 }  
  46.             }  
  47.         }  
  48.   
  49.         if ((index + 1) != end) {  
  50.             ArrayUtils.exchangeElements(array, index + 1, end);  
  51.         }  
  52.   
  53.         return index + 1;  
  54.     }  
  55. }