原理
找轴值,然后从轴值处一分为二,进行递归操作
递归出口,就是只剩一个元素,该元素,就为本身的轴值
向上一层回溯,找到上一层,右边的轴值
排序就是由每个轴值组成
第一次划分演示
结果演示
//快速排序
#include<iostream>
using namespace std;
//划分,查找轴值(数组的第一个元素,是查找对象,轴值右边 :> 轴值,左边:< 轴值)
int divide(int r[], int first, int end);
//递归,将大——>小
void quick_sort(int r[], int first, int end);
int main()
{
int r[100], n;
while (cin >> n, n != EOF)
{
for (int i = 0; i < n; i++)
{
cin >> r[i];
}
quick_sort(r, 0, n - 1);
for (int i = 0; i < n; i++)
{
cout << r[i]<<" ";
}
cout << endl;
}
return 0;
}
int divide(int r[], int first, int end)
{
int i = first;
int j = end;
//轴值位置确定条件——i == j, i ,j 均指向轴值,说明轴值不需要和任何数做比较了
int temp;
while (i < j)
{
//对轴值右侧进行扫描——找出小于轴值的第一个数,交换位置,到轴值的左边
//跳出循环——向右侧扫描时,遇到 < 轴值的数
while (i < j&&r[i] <= r[j])j--;
//交换
if (i < j)
{
temp = r[i];
r[i] = r[j];
r[j] = temp;
//已经交换到 最靠近左边了,故i前面的值都是不需要扫描的了
i++;
}
//同理,扫描左侧,同时j指向轴值
//轴值在右边,左边值应小于 轴值,否则跳出循环
while (i < j&&r[i] <= r[j])i++;
if (i < j)
{
temp = r[i];
r[i] = r[j];
r[j] = temp;
j--;
}
}
return i;//返回轴值所在位置
}
void quick_sort(int r[], int first, int end)
{
int mid;
//不满足条件时,跳出这一层递归,返回上一层继续执行
if (first < end)
{
mid = divide(r, first, end);//找轴值
quick_sort(r, first, mid);//左递归
quick_sort(r, mid + 1, end);//右递归
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。