快速排序
2016-07-19 10:12
323 查看
快速排序
快速排序的基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录,继续进行排序,已达到整个序列有序。白话解释:
1. 先从数列中取出一个数做基准,这个位置叫枢轴
2. 分区过程,将比这个数大的放在右边,小于或者等于的放在左边
3. 在对左右区间重复第2步直到,区间只有一个数据
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
快速排序 | O(nlogn) | O(nlogn) | O(n2) | O(logn)-O(n) | 不稳定 |
代码实现:
public static int[] quickSort(int[] A,int length){ if(A==null || length<=0){ throw new IllegalArgumentException("the input is error"); } Quick(A,0,length-1); return A; } public int[] Quick(int[] A,int left,int right){ if(left<right){ int middle = Partition(A,left,right); Quick(A,left,middle-1); Quick(A,middle+1,right); } return A; } public int Partition(int[] A,int left,int right){ int key=A[left]; while(left<right){ while(left < right && A[right]>=key){ right--; } A[left]=A[right]; while(left < right && A[left]<=key){ left++; } A[right]=A[left]; } A[left]=key; return left; }
partition函数的作用就是先选取一个关键字,然后想尽一切办法,将它放到一个位置,使它左边的值都比它小,右边的值比它大,这样的关键字称为枢轴。
例子:{50,10,90,30,70,40,80,60,20}
key = A[left] = 50
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
50 | 10 | 90 | 30 | 70 | 40 | 80 | 60 | 20 |
left | right |
执行partition
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 90 | 30 | 70 | 40 | 80 | 60 | 20 |
left | right |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 90 | 30 | 70 | 40 | 80 | 60 | 90 |
left | right |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 40 | 30 | 70 | 40 | 80 | 60 | 90 |
left | right |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 40 | 30 | 70 | 70 | 80 | 60 | 90 |
left right |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
20 | 10 | 40 | 30 | 50 | 70 | 80 | 60 | 90 |
left right |
优化方法:
优化选取的枢轴,我们代码中选的是left,可以优选成三数取中法,三个关键字进行排序,将中间的选为枢轴,一般取左端、右端和中间三个数。
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)