描述
1)这里只实现了三数取中快排quickSort;时间复杂度为O(nlogn)
2)在STL中的sort函数,是一种混合排序(自省式排序)
——如果递归深度过深,采用堆排序;如果当前排序元素过少,则使用插入排序(插入排序在数组相对有序的情况下,性能比快排好);否则是使用三数取中快排;
3)基于快排思想,快速选择第rank个最小的元素quickSelect;时间复杂度为O(n);
源码
#pragma once
#include<vector>
class QuickSort {
private:
//三数取中,将中值放在first上
void swapThreeMedian(int& first, int& second, int& third) {
if (second < first) std::swap(second, first);
if (second < third) std::swap(second, third);
if (first < third) std::swap(first, third);
}
//三数取中快排
void quickSort(std::vector<int>& nums, int begin, int end) {
if (end - begin <= 1) return;
swapThreeMedian(nums[begin], nums[begin + (end - begin) / 2], nums[end - 1]);
int left = begin + 1;
int right = end - 1;
int pivot = begin;
while (left <= right) {
while (left <= right && nums[left] <= nums[pivot]) ++left;
while (left <= right && nums[right] > nums[pivot])--right;
if (left < right)
std::swap(nums[left], nums[right]);
}
std::swap(nums[pivot], nums[right]);
quickSort(nums, begin, right);
quickSort(nums, right + 1, end);
}
//部分快排
bool quickSelect(std::vector<int>& nums, int begin, int end, int rank) {
if (begin > rank || end <= rank) return false;
swapThreeMedian(nums[begin], nums[begin + (end - begin) / 2], nums[end - 1]);
int left = begin + 1;
int right = end - 1;
int pivot = begin;
while (left <= right) {
while (left <= right && nums[left] <= nums[pivot]) ++left;
while (left <= right && nums[right] > nums[pivot])--right;
if (left < right)
std::swap(nums[left], nums[right]);
}
std::swap(nums[pivot], nums[right]);
if (right == rank) return true;
if (right > rank) return quickSelect(nums, begin, right, rank);
return quickSelect(nums, right + 1, end, rank);
}
public:
//三数取中快排
void quickSort(std::vector<int>&nums) {
quickSort(nums, 0, nums.size());
}
//快速选择第rank个最小的元素
int quickSelect(std::vector<int>& nums, int rank) {
quickSelect(nums, 0, nums.size(), rank);
return nums[rank];
}
};