要求:实现快排函数,
void quick_sort(Record* startPointer, Record* endPointer)
快速排序思路
- 找一个基准数
- 通过排序将待排记录分割成独立的两部分,其中一部分所有的数都比基准数小,另一部分所有的数都比基准数大
- 分割完以后,可以确定的是,基准数已经到了它相应的位置。
- 然后再对两部分分别进行快排
代码实现(从小到大排序)
我们设置基准数(这里设置第一个为基准数)key
再设置两个哨兵 i , j,一个从前往后找,另一个从后往前找
这里的 i 和 j 可以理解为 比key小的部分 和 比key大的部分
先让 j 向前移动,从后往前找到第一个比基准数小的数 x ,如果没有超出 i < j 的范围就把 x 放进到 i 里。
并且 i 这个坑位已经放进了比基准数小的,所以让 i ++
while (*j > key && i < j) j--;
if (i < j) {
*i = *j;
i++;
}
同理让 i 向后移动
while (*i < key && i < j) i++;
if (i < j) {
*j = *i;
j--;
}
最后分割完,并且返回基准数的指针位置,这是分割的完整代码
template <class Record>
Record* getindex(Record *startPointer,Record *endPointer) {
Record*i = startPointer;
Record*j = endPointer;
Record key = *startPointer;
while (i < j) {
while (*j > key && i < j) j--;
if (i < j) {
*i = *j;
i++;
}
while (*i < key && i < j) i++;
if (i < j) {
*j = *i;
j--;
}
}
*i = key;
return i;
}
递归部分
用getindex找到基准数指针和位置后,在对两部分分别进行快排,一部分是从startPointer到index-1,另一部分是从index+1到endPointer
同时写出退出条件,当 startPointer >= endPointer (即只剩一个数时)就不用排了
template <class Record>
void quick_sort(Record* startPointer, Record* endPointer) {
if (startPointer < endPointer) {
Record* index = getindex(startPointer,endPointer);
quick(startPointer,index-1);
quick(index+1,endPointer);
}
}