Java版 快速排序

2014-11-24 07:14:34 · 作者: · 浏览: 0

一、简单步骤(数字从左向右依次递增)

1. 找出主元,可以是任意元素,这里总是选择最后一个最为主元

2. 从左向右依次查找,比主元小的放到左侧

3. 当查找到末尾后,主元与左侧小于主元的下一个数字交换。

这样得到一个主元左侧都比主元小,相反右侧都大于主元


二、实现代码

[java]
  1. public class QuickSort {
  2. public static void main(String[] args) {
  3. int[] arr = {6, 9, 2, 5, 8, 6};
  4. QuickSort quickSortSample = new QuickSort();
  5. quickSortSample.quickSort(arr, 0, arr.length-1);
  6. for (int j = 0; j < arr.length; j++) {
  7. System.out.print( + arr[j]);
  8. }
  9. }
  10. public void quickSort(int data[], int start, int end) {
  11. if (start < end) {
  12. int partitionIndex = partition(data, start, end);
  13. quickSort(data, start, partitionIndex-1);
  14. quickSort(data, partitionIndex+1, end);
  15. }
  16. }
  17. public int partition(int data[], int start, int end) {
  18. int key = data[end]; // 以最后一个元素,data[hi]为主元
  19. int i = start -1 ;
  20. for (int j = start; j < end; j++) {
  21. if (data[j] <= key) {
  22. i = i + 1;
  23. swap(data, i, j);
  24. }
  25. }
  26. swap(data, i+1, end);
  27. return i+1;
  28. }
  29. private void swap(int data[] , int i, int j) {
  30. int temp = data[i];
  31. data[i] = data[j];
  32. data[j] = temp;
  33. }
  34. }

    三、逐步演示

    6, 9, 2, 5, 8, 6


    当前指向位置 交换的判断条件 交换后的数组
    i = 0, j = 0 6 <= 6 6 9 2 5 8 6
    i = 1, j = 2 2 <= 6 6 2 9 5 8 6
    i = 2, j = 3 5 <= 6 6 2 5 9 8 6
    i = 3 i之前都主元6小 6 2 5 6 8 9


    当前指向位置 交换的判断条件 交换后的数组
    i = 0, j = 1 2 <= 5 2 6 5 6 8 9
    i = 1 i之前都主元5小 2 5 6 6 8 9


    当前指向位置 交换的判断条件 交换后的数组
    i = 4, j = 4 8 <= 9 2 5 6 6 8 9
    i = 5 i之前都主元9小 2 5 6 6 8 9



    四、参考资料

    WIKI - 排序算法 http://zh.wikipedia.org/wiki/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95
    白话经典算法系列之六 快速排序 快速搞定 http://blog.csdn.net/morewindows/article/details/6684558
    快速排序算法 http://blog.csdn.net/v_JULY_v/article/details/6116297
    十二之续、快速排序算法的深入分析 http://blog.csdn.net/v_july_v/article/details/6211155
    十二之再续:快速排序算法之所有版本的c/c++实现 http://blog.csdn.net/v_july_v/article/details/6262915