c++快排算法,自己用来做笔记,时间原因写的比较乱,可以参考一下。
int array[] = { 60, 68, 59, 52, 72, 28, 96, 33, 24 };
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
60 | 68 | 59 | 52 | 72 | 28 | 96 | 33 | 24 |
原始数组,现在的实现思想就是取一个基准,从右边开始找比基准小的,往左边放, 右边就空了一个位置,需要
从左边找比基准大的往右边空位置放。依次填空,补空。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
68 | 59 | 52 | 72 | 28 | 96 | 33 | 24 |
首先取区间第一数a[0]=60为基准,设置x = a[0]=60,所以a[0]相当于空了,需要来找数组右边i = 8到i=0比基准小的数字来填充。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
24 | 68 | 59 | 52 | 72 | 28 | 96 | 33 |
右边比x=60小的就是j = 8 的数array[8]=24,所以 a[0]=a[8]=24,
所以a[8]就空了 此时j = 8
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
24 | 59 | 52 | 72 | 28 | 96 | 33 | 68 |
所以找到a[1] = 68比x = 60 大,a[8] = a [1] = 68
此时i= 1 ,a[1]为空,所以需要从j=8开始找比x=60小的数
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
24 | 33 | 59 | 52 | 72 | 28 | 96 | 68 |
找到a[1] = a[7] = 33
a[7] 空, ,j = 7,从i=1开始找比60大的数
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
24 | 33 | 59 | 52 | 28 | 96 | 72 | 68 |
a[7] = a[4] =72
i = 4,a[4] 空
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
24 | 33 | 59 | 52 | 28 | 96 | 72 | 68 |
a[4] = a[5]=28,a[5]空
j = 5
从 i = 4 开始找比60大的数 就是i = j = 5 终止循环
所以把 x= 60填入a[5]中
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
24 | 33 | 59 | 52 | 28 | 60 | 96 | 72 | 68 |
所以这是第一次循环把所有大于60的数都放到右边,小于的数都放到了左边
然后继续在 l,到 i -1之间 执行以上步骤
i+1 ,r到之间执行以上步骤
void quick_sort2(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;/*枢轴记录到位*/
quick_sort2(a, low, first - 1);
quick_sort2(a, first + 1, high);
}
int main()
{
int array[] = { 60, 68, 59, 52, 72, 28, 96, 33, 24 };
int length = sizeof(array) / sizeof(int);
quick_sort2(array, 0, length - 1);
for (int i = 0; i < length; i++)
{
cout << array[i]<< endl;
}
}