quicksort:分治思想。
分解:数组A[p, r)被划分成两个子数组A[pq) 和 A[q+1,
r),使得A[pq)中的每个元素小于等于A[q],
A[q]也小于A[q+1r)中的每个元素。q是划分过程要返回的结果。
解决:递归调用quicksort,对子数组A[pq) 和 A[q+1,
r)进行排序。
合并:因为子数组都是原址排序的,所以不需要合并操作:A[pr)已经有序。
代码数组下标从0开始,并且所有函数使用左闭右开区间。与算法导论第三版书上的伪代码不同的部分在注释标出。
#include
<IOSTREAM>
#include
<CSTDIO>
#include
#include
<CTIME>
#include <CSTDLIB>
inline void swap(int
&a, int &b)
{ int t = a; a = b; b = t; }
int
partition(int *a, int p, int r) { //对 a[p, r) 原址重排
int x = a[r-1];
//a[r] ==> a[r-1]
int i = p - 1;
for (int j = p; j < r -
1; ++j)
if (a[j] <= x) {
++i;
swap(a[i],
a[j]);
}
swap(a[i+1], a[r-1]);
return i +
1;
}
void quicksort(int *a, int p, int r) { //调用quicksort(a,
0, n),不是(a, 0, n-1),区间a[0, n)
if (p < r - 1) { //(p < r) ==>
(p < r - 1)
int q = partition(a, p, r);
quicksort(a, p, q);
//(a, p, q-1) ==> (a, p, q)
quicksort(a, q+1,
r);
}
}
int
main()
{
srand(time(NULL));
int n;
while
(scanf("%d", &n)) {
int a[n];
for (int i = 0; i < n;
++i)
a[i] = rand() % n;
for (int i = 0; i < n;
++i)
printf("%d ", a[i]);
printf("\n");
quicksort(a,
0, n);
for (int i = 0; i < n; ++i)
printf("%d ",
a[i]);
printf("\n");
}
} www.yz-jx.com
随机测试几万组数据与stl 的sort产生结果一致。
相关文章
- 05-19Python3实现快速排序
- 05-19快速排序的几种实现方式
- 05-19快速排序的基本实现
- 05-19快速排序(QuickSort)
- 05-19快速排序算法__python实现
- 05-191.简单算法python实现:快速排序
- 05-19冒泡排序、选择排序、插入排序、快速排序、归并排序的思想与实现
- 05-19快速排序的实现
- 05-19快速绘制动态排序图 — Pyecharts 高级组件 Timeline 实现!
- 05-19算法设计与分析(三)分治法--快速排序的递归和非递归实现