一道快排的考研真题
来源:3-5 快速排序法 - Quick Sort
ych_1997
2021-08-13
今天遇到了一道考研真题,是某学校自主命题的。还没找到标准答案,只能在草稿纸上写写画画。我想要验证答案是否正确。
原题目:
已知关键字集合{11, 2, 16, 30, 8, 28, 4, 9, 20, 17}
,若采用快速排序,且关键字按非递增排序,请给出以最后一个关键字为枢纽的第一趟排序结果。
这道题我翻译成课程的描述是:使用快速排序按从大到小排序。以最后一个元素为v,求第一趟快速排序的结果。
因为只用看第一趟,这是我改的partition实现:
int __partition(T arr[], int l, int r){
T v = arr[r];
int j = l-1;
for( int i = l; i < r ; i ++ )
if( arr[i] > v ){
j ++;
swap( arr[j] , arr[i] );
}
swap( arr[r] , arr[j+1]);
return j+1;
}
我觉得这个不在课程的答疑范围,但是实在没有资源问到标准答案,bobo老师如果有空的话帮我看看,谢谢!
写回答
1回答
-
你的代码是正确的。
但是,这种考试题的问题在于,考纲中的标准代码到底是什么。以快速排序为例,课程中给出了三种不同的 partition,对于同一个数据,给出的结果可能是不同的(都满足标定点左侧和右侧的范围要求)。如果你可以用自己写的代码来说明为什么是这个结果,这个代码没有问题。
继续加油!:)
052021-08-14
相似问题