c++有一个sort()方法,但是它的底层怎么实现的呢?
这篇文章介绍一个实现方法。
实现步骤:
-
定义一个变量key,用于保存基准值,初始值为a[left]。
-
定义一个变量hole,用于保存空洞的位置,初始值为left。
-
进入一个循环,循环条件是left < right,即左右指针没有相遇。
-
在循环中,首先从右边开始,找到第一个小于基准值的元素的下标,将right指针左移,直到找到符合条件的元素或者left和right相遇。
-
将a[right]的值赋给a[hole],将空洞的位置移动到right。
-
然后从左边开始,找到第一个大于基准值的元素的下标,将left指针右移,直到找到符合条件的元素或者left和right相遇。
-
将a[left]的值赋给a[hole],将空洞的位置移动到left。
-
重复步骤4到步骤7,直到left和right相遇。
-
最后,将基准值key放入空洞的位置a[hole],将基准值放在正确的位置上。
-
返回空洞的位置hole。
同样实现了将数据分成两部分,左边的元素都小于等于基准值,右边的元素都大于基准值。
图示:
实现代码:
int PartSort2(int* a, int left, int right)
{
//三数取中优化
//int keyi = NumBers(a, left, right);
//Swap(&a[keyi], &a[left]);
int key = a[left];
int hole = left;//为第一个坑
while(left < right){
while(left < right && a[right] >= key){//从右寻找比key小的值
++right;
}
a[hole] = a[right];
hole = right;
while(left < right && a[left] <= key){//从左寻找比key大的值
++left;
}
a[hole] = a[left];
hole = left;
}
a[hole] = key;
return hole;
}