您的位置:首页 > 其它

排序算法——快速排序

2009-11-10 21:31 423 查看
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。

步骤为:

1.从数列中挑出一个元素,称为 "基准"(pivot),

2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。

3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

最坏时间复杂度: O(n^2),平均时间复杂度:O(nlogn)

快速排序是不稳定的排序算法。



Code:

#include <stdio.h>

void swap(int *a, int *b)

{

int temp = *a;

*a = *b;

*b = temp;

}

int partition(int a[], int p, int q)

{

int x, i, j;

x = a[p];/* x as a pivot */

i = p;

for (j = p + 1; j < q; j++) {

if (a[j] <= x) {

i++;

swap(&a[i], &a[j]);

}

}

swap(&a[p], &a[i]);

return i;

}

void quick_sort(int a[], int p, int q)

{

if (p < q) {

int r = partition(a, p, q);

quick_sort(a, p, r); /* sort sub list a[p, r) */

quick_sort(a, r+1, q);/* sort sub list a[r+1,q) */

}

}

int main()

{

int a[] = {6, 10, 13, 5, 8, 3, 2, 11}, i;

int size = sizeof(a) / sizeof(int);

quick_sort(a, 0, size);

for (i = 0; i < size; i++)

printf("%d ", a[i]);

return 0;

}

如果我们调用的是quick_sort(a, 0, size - 1),那么要做以下修改

code 16:j <= q

code 30:quick_sort(a, p, r-1)

code 31:quick_sort(a, r+1, q)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: