排序算法——快速排序
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)
步骤为:
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)
相关文章推荐
- 基于分治策略的排序算法:合并排序和快速排序
- 排序算法——快速排序
- [029]八大排序算法详解——快速排序
- 排序算法之快速排序
- 排序算法之快速排序
- 排序算法总结(6)——快速排序
- C语言------排序算法------快速排序(五)
- 排序算法——快速排序
- 七大基本排序算法之快速排序
- java算法(一)——排序算法(下)之 快速排序
- 排序算法_快速排序
- 【常用排序算法】以最简单的方式理解快速排序
- 排序算法之快速排序
- 排序算法(五)——快速排序
- 【常用排序算法】快速排序(Java实现)
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 排序算法之快速排序
- 必须知道的八大种排序算法【java实现】(一) 冒泡排序、快速排序
- 排序算法五:交换排序之快速排序
- 基本排序算法04----快速排序(quick sort)