快速排序
- 快速排序
其思想是:先选一个“标尺”, 用它把整个队列过一遍筛子, 以保证:其左边的元素都不大于它,其右边的元素都不小于它。这样,排序问题就被分割为两个子区间。 再分别对子区间排序就可以了。
每次“标尺”被选取后,其肯定被放在最终的位置上。即每次调用的结果----主元排好了序,时间复杂度为 O(nlogn)
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
int i = l, j = r;
int x = s[l]; //选取主元
while (i < j) //将不符合的元素(合适:比主元大的元素在右边,小的在左边)进行交换
{
while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
j--;
if(i < j)
s[i++] = s[j];
while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
i++;
if(i < j)
s[j--] = s[i];
}
s[i] = x; //主元已排好序
quick_sort(s, l, i - 1); // 递归调用
quick_sort(s, i + 1, r);
}
}