快速排序描述
-
从数列中挑出一个元素,称为 "基准"(pivot)
-
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
-
递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
示例代码
示例代码为C语言,输入参数中,需要排序的数组为arr[],取出一个元素为pivot,并根据 pivot值,将数组按照大于pivot和小于pivot分为两个区域,递归完成排序。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void quick_sort(char *arr, int begin, int end)
5 {
6 char pivot = arr[begin];
7 int i,j;
8 i = begin;
9 j = end;
10 while(i < j) {
11 while(arr[j] >= pivot && i < j)
12 j --;
13 arr[i] = arr[j];
14 while(arr[i] <= pivot && i < j)
15 i ++;
16 arr[j] = arr[i];
17 }
18 arr[i] = pivot;
19
20 if( i-1 > begin)
21 quick_sort(arr, begin, i - 1);
22 if( end > i + 1)
23 quick_sort(arr, i + 1, end);
24 }
25
26 int main()
27 {
28 char ch[] = "qwertyuiopasdfghjklzxcvbnm";
29 quick_sort(ch, 0 ,25);
30 printf("%s\n", ch);
31 exit(0);
32 }
输出结果
abcdefghijklmnopqrstuvwxyz
算法分析
最差时间复杂度 Θ(n2) 最优时间复杂度 Θ(nlog n) 平均时间复杂度 Θ(nlog n)
原理
已知一组无序数据a[1]、a[2]、……a[n],需将其按升序排列。首先任取数据a[x]作为基准。比较a[x]与其它数据并排序,使a[x]排在数据的第k位,并且使a[1]~a[k-1]中的每一个数据<a[x],a[k+1]~a[n]中的每一个数据>a[x],然后采用分治的策略分别对a[1]~a[k-1]和a[k+1]~a[n]两组数据进行快速排序。
优劣
优点:极快,数据移动少;缺点:不稳定。