1、算法思想
上面的内容刚开始我也不是全部懂,就知道它每一趟的目的是把小于关键数据的数据都排到它的左边(对于升序排序而言),大于关键数据的数据都排到关键数据的右边。但3)4)5)步看不太明白,不知道它到底是怎么实现的,我现在将我如何理解明白的方法分享一下。
2、核心代码
void quickSort(int *data, int low, int high)
{
if (data == NULL || low >= high)
{
return;
}
int pivotLoc;
pivotLoc = partition(data, low, high);
if (pivotLoc == -1)
cout << "Wrong input" << endl;
quickSort(data, low, pivotLoc - 1);
quickSort(data, pivotLoc + 1, high);
}
int partition(int *data, int low, int high)
{
if (data == NULL || low >= high)
{
return -1;
}
int keyData = data[low];
while (low<high)
{
while ((low < high) && (data[high] >= keyData))
high--;
data[low] = data[high];
while ((low < high) && (data[low] <= keyData))
low++;
data[high] = data[low];
}
data[low] = keyData;
return low;
}
还有值得一提的是,一趟结束后,关键数据就处在了应该在的正确位置。
比如
7,6,1,4,5,9,10,2
按这样的原则,关键数据就是7,一次运算后变成了
2,6,1,4,5,7,10,9
左边都是小于7的,右边都是大于7的,且排在第6位,而这组排列最终排好的顺序的结果应该是
1,2,4,5,6,7,9,10
7就是排在第6位,也就是说,快速排序的每一趟,都让关键数据排在了正确的位置
可能你光看我这走一遍还一思半解的,我当初也是,自己跑第一遍的时候还是模模糊糊的,但自己用笔在纸上像这样再跑了两遍后,就体会到了这算法的妙处了。这个算法非常巧妙,就这样看着实现了要完成的功能,可你如果要我为了实现这个功能,来自己设计出这个算法啊?那我也青史留名了。。所以我们只需要学习,然后记住天才们想出的算法,以后会用就足够了。
那么partition这个函数就搞定了。我已经授之以渔了,至于quickSort函数,简而言之就是对关键数据的左边和右边再重复做partition(递归哟),直到最终顺序都顺了就结束,相信你自己跑一遍肯定也很快会弄懂了。
3、Test程序
#include<iostream>
#include<string>
using namespace std;
void quickSort(int *data, int low, int high);
int partition(int *data, int low, int high);
void main(void)
{
int array[10] = {9,8,7,6,5,4,3,2,1,0};
int num = 10;
//step1: 遍历数组,输出初始排列
for (int arN = 0; arN < num; arN++)
{
cout << array[arN]<<' ';
}
cout << endl;
//step2: 快速排序
quickSort(array, 0, num-1);
//step3: 遍历数组,输出排序后结果
for (int arN = 0; arN < num; arN++)
{
cout << array[arN]<<' ';
}
}
void quickSort(int *data, int low, int high)
{
if (data == NULL || low >= high)
{
return;
}
int pivotLoc;
pivotLoc = partition(data, low, high);
if (pivotLoc == -1)
cout << "Wrong input" << endl;
quickSort(data, low, pivotLoc - 1);
quickSort(data, pivotLoc + 1, high);
}
int partition(int *data, int low, int high)
{
if (data == NULL || low >= high)
{
return -1;
}
int keyData = data[low];
while (low<high)
{
while ((low < high) && (data[high] >= keyData))
high--;
data[low] = data[high];
while ((low < high) && (data[low] <= keyData))
low++;
data[high] = data[low];
}
data[low] = keyData;
return low;
}
运行结果:
欢迎评论交流,觉得好就顶个吧,写了老半天了不容易啊。。