快速排序
原理
这是一个利用递归排序的算法。
给我一组序列(未必是数组,也可以是链表),首先要知道其长度。
定义一个函数,输入参数要包括待排序的序列指针,子序列起始元素索引low,终止元素索引high。
1.将起始元素存于临时变量tmp中。
2.将起始元素索引,终止元素索引存为临时变量head和rear,便于递归时调用。
3.(!!!)low和high如果已经重合,或low已大于high,则停止递归。
3.终止元素索引high指向的元素,是否比tmp大?
如果大,则向左移动一位
如果小,不仅不移动,还要将high指向的元素值赋给起始元素索引low指向的元素值
暂停移动high,开始移动low。
4.起始元素索引low指向的元素,是否比tmp小?
如果小,则向右移动一位
如果大,不仅不移动,还要将low指向的元素值赋给high指向的元素值
暂停移动low,开始移动high。
5.对于第3和4步,low和high相同时停止移动。
6.将tmp的值赋给low(high)所在位置。
7.此时序列被一分为二。分别递归地对左右两部分调用自身对(head—low-1)、(low+1—rear)排序
以下是代码
void quick(int *a,int low, int high) {
int tmp;
int head = low; //为了保留切分后数组的长度,首元素等信息
int rear = high;
tmp = a[low];
if (low >= high)
return; //递归的停止条件,即切分后只剩两个元素时停止
while (low != high) {
while (low != high && a[high] > tmp) {
high--;
}
a[low] = a[high];
while (low != high && a[low] < tmp) {
low++;
}
a[high] = a[low];
}
a[high] = tmp;
quick(a, head, high-1);
quick(a, high + 1, rear);
}