(1)排序思路
-
1、先从数列中取出一个数作为基准数
-
2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
-
3、再对左右区间重复第二步,直到各区间只有一个数
(2)表格流程介绍
- 概括来说两个流程:挖坑填数+分治
- 第一步:以第一个数为基准元素,尾指针从后往前扫描,找到第一个比基准元素小的数,调换位置
- 第二步:头指针从前往后扫描,找到比尾指针位置元素大的第一个数,调换位置
- 第三步:重复上面步骤,直到数组划分为基准元素为中的两部分,对这两部分继续求解
- 总结
-
1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
-
2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
-
3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
-
4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
-
(3).代码
void quick_sort(int s[], int l, int r)
{
if (l < r)
{
//Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
int i = l, j = r, 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);
}
}