快速排序:
1. 设置变量i=0, j=N-1,设置关键数据,也就是比较的数据key,key可以随便取,也可以取key=A[0]
2. 从j开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]的值赋给A[i];
3. 从i开始向后搜索(i++),找到第一个大于key的A[i],将A[i]的值赋给A[j];
4. 重复第2、3步,直到i=j; (2,3步中,没找到符合条件的值,即2中A[j]不小于key,3中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)
演示:
第一步:设置i,j和key
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
2 | 7 | 5 | 6 | 0 | 8 | 4 | 1 | 9 | 3 |
i=0, j=9, key=2
第二步:j从后向前搜索,找到第一个小于2的值1,交换
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 7 | 5 | 6 | 0 | 8 | 4 | 2 | 9 | 3 |
i=0, j=7, key=2
第三步:i从前向后搜索,找到第一个大于2的值7,交换
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 2 | 5 | 6 | 0 | 8 | 4 | 7 | 9 | 3 |
i=1, j=7, key=2
重复第二步,j从后向前搜索
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 0 | 5 | 6 | 2 | 8 | 4 | 7 | 9 | 3 |
i=1, j=4, key=2
重复第三步,i从前向后搜索
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 0 | 2 | 6 | 5 | 8 | 4 | 7 | 9 | 3 |
i=2, j=4, key=2
重复第二步,j从后向前搜索,此时i=j=2
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
1 | 0 | 2 | 6 | 5 | 8 | 4 | 7 | 9 | 3 |
第四步:将key左边和右边的再分别进行以上步骤排序,直到最终排好
C++实现:
#include <iostream> using namespace std; void Qsort(int a[], int low, int high) { if(low >= high) { return; } int first = low; int last = high; int key = a[first];/*用字表的第一个记录作为枢轴*/ while(first < last) { while(first < last && a[last] >= key) { --last; } a[first] = a[last];/*将比第一个小的移到低端*/ while(first < last && a[first] <= key) { ++first; } a[last] = a[first]; /*将比第一个大的移到高端*/ } a[first] = key;/*枢轴记录到位*/ Qsort(a, low, first-1); Qsort(a, first+1, high); } int main() { int a[] = {57, 68, 59, 52, 72, 28, 96, 33, 24}; Qsort(a, 0, sizeof(a) / sizeof(a[0]) - 1);/*这里原文第三个参数要减1否则内存越界*/ for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { cout << a[i] << ""; } return 0; }/*参考数据结构p274(清华大学出版社,严蔚敏)*/
python实现
def quick_sort(data): """快速排序""" if len(data) >= 2: # 递归入口及出口 mid = data[len(data)//2] # 选取基准值,也可以选取第一个或最后一个元素 left, right = [], [] # 定义基准值左右两侧的列表 data.remove(mid) # 从原始数组中移除基准值 for num in data: if num >= mid: right.append(num) else: left.append(num) return quick_sort(left) + [mid] + quick_sort(right) else: return data