排序算法——快速排序
来源:互联网 发布:计数型数据过程能力 编辑:程序博客网 时间:2024/05/22 15:41
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。
步骤为:
1.从数列中挑出一个元素,称为 "基准"(pivot),
2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分割之后,该基准是它的最后位置。这个称为分割(partition)操作。
3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
最坏时间复杂度: O(n^2),平均时间复杂度:O(nlogn)
快速排序是不稳定的排序算法。
- #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)
- 排序算法—快速排序
- 排序算法—快速排序
- 排序算法———快速排序
- 排序算法(一)——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- 经典排序算法——快速排序
- 排序算法——快速排序
- 经典排序算法——快速排序
- 经典排序算法——快速排序
- 排序算法5——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- c++排序算法——快速排序
- 算法——排序之快速排序
- 排序算法——快速排序
- 排序算法——快速排序
- 为什么Linux内核不使用C++开发
- SSH框架
- 有关VA_LIST的用法
- 网眼博客:我希望我写下的每个文字都会唱歌
- 一个小程序
- 排序算法——快速排序
- 最让人汗颜的招聘人员
- 递归实现快速排序
- IE中的过滤器效果
- QXGameEngine:Silverlight – MMORPG游戏引擎开源
- java
- 期待和你的相识!
- 线性链表---数据结构
- ASP.NET页面刷新的实现方法