厚积薄发

不忘初心,方得始终!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

基本思想

选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

实例

实现

 1 //不稳定
 2 public class QuickSort {
 3     public static void main(String[] args) {
 4         int[] a = { 49, 38, 65, 97, 76, 13, 27, 49, 78, 34, 12, 64, 1, 8 };
 5         System.out.println("排序之前:");
 6         for (int i = 0; i < a.length; i++) {
 7             System.out.print(a[i] + " ");
 8         }
 9         // 快速排序
10         quick(a);
11         System.out.println();
12         System.out.println("排序之后:");
13         for (int i = 0; i < a.length; i++) {
14             System.out.print(a[i] + " ");
15         }
16     }
17 
18     private static void quick(int[] a) {
19         if (a.length > 0) {
20             quickSort(a, 0, a.length - 1);
21         }
22     }
23 
24     private static void quickSort(int[] a, int low, int high) {
25         if (low < high) { // 如果不加这个判断递归会无法退出导致堆栈溢出异常
26             int middle = getMiddle(a, low, high);
27             quickSort(a, 0, middle - 1);
28             quickSort(a, middle + 1, high);
29         }
30     }
31 
32     private static int getMiddle(int[] a, int low, int high) {
33         int temp = a[low];// 基准元素
34         while (low < high) {
35             // 找到比基准元素小的元素位置
36             while (low < high && a[high] >= temp) {
37                 high--;
38             }
39             a[low] = a[high];
40             while (low < high && a[low] <= temp) {
41                 low++;
42             }
43             a[high] = a[low];
44         }
45         a[low] = temp;
46         return low;
47     }
48 }

分析

  • 快速排序是不稳定的排序
  • 快速排序的时间复杂度为O(nlogn)
  • 当n较大时使用快排比较好,当序列基本有序时用快排反而不好
posted on 2016-06-30 11:39  欢迎来到Java的世界  阅读(124)  评论(0编辑  收藏  举报