快速排序是一种in-place算法,主要有两步,三数中值排序和pivot插入。其写法比较经典,所以最好理解之后背下来
三数中值排序相对简单,要注意三个数比较的顺序
void median(vector<int>& nums, int left, int right, int mid){
if(nums[left]>nums[mid]) swap(nums[left], nums[mid]);
if(nums[left]>nums[right]) swap(nums[left], nums[right]);
if(nums[mid]>nums[right]) swap(nums[mid], nums[right]);
swap(nums[mid], nums[right-1]);
}
pivot插入程序:
i = left;
j = right-1;
while(i<j){
while(nums[++i]<nums[right-1]) {}
while(nums[--j]>nums[right-1]) {}
if(i<j) swap(nums[i], nums[j]);
}
swap(nums[right-1], nums[i]);
(关于为什么是in-place的算法,这里再BB一句:因为它是不断交换元素的位置,完整代码如下。而merge-sort就不是,需要第三个数组存储排序后的数组)
快排稳定性探讨与实现

本文分析了快速排序算法的不稳定性,源于相等元素在排序过程中可能交换位置。通过详细解释三数中值排序和pivot插入过程,指出在特定情况下快排的不稳定性。讨论了如何设计稳定版本的快排,并提供了进一步研究的链接。
最低0.47元/天 解锁文章
6666

被折叠的 条评论
为什么被折叠?



