class solution {
private:
int partition(vector<int>& nums, int low, int high) {
int i = low;
int j = high + 1;
int p = nums[low];
while (1) {
while (nums[++i] < p) {//找到一个大于p的值
if (i == high)break;//跳出当前循环
}
while (nums[--j] > p) {
if (j == low)break;//跳出当前循环
}
if (i >= j)break;//当i>=j时,说明j遍历到了该和p交换的位置,此时跳出大循环
swap(nums[i], nums[j]);
}
swap(nums[low], nums[j]);
return j;
}
void quicksort(vector<int>& nums, int low, int high) {
if (low >= high)return;
int j = partition(nums, low, high);
quicksort(nums, low, j - 1);
quicksort(nums, j + 1, high);
}
public:
vector<int>sort(vector<int>nums) {
int low = 0;
int high = nums.size() - 1;
quicksort(nums, low, high);
return nums;
}
};
int main() {
solution s1;
vector<int> nums = { 40,10,65,20,90,30,25,80,70,60 };
vector<int>result = s1.sort(nums);
for (auto i : result) {
cout << i << " ";
}
}
说明:partition()函数的作用就是将当前数组的第一个元素(分割值)放到它该在的位置上;
quicksort()函数做递归操作,递归的终止条件就是low>=high
#include <iostream>
#include <vector>
using namespace std;
class solution {
private:
void maxheapInit(vector<int>& nums, int root, int len) {
int left = 2 * root + 1;
int right = 2 * root + 2;
int max = root;
if (left<len && nums[left]>nums[max])max = left;
if (right<len && nums[right]>nums[max])max = right;
if (max != root) {
swap(nums[root], nums[max]);
maxheapInit(nums, max, len);
}
}
public:
vector<int> heapSort(vector<int>nums) {
int len = nums.size();
for (int i = len / 2 - 1; i >= 0; i--) {
maxheapInit(nums, i, len);
}
cout << "初始化大顶堆:" << endl;
for (int i : nums)
cout << i << ' ';
cout << endl;
for (int i = len - 1; i >= 0; i--) {
swap(nums[i], nums[0]);
maxheapInit(nums, 0, i);//注意这里是i,到达相应位置上的元素就不再动他了
}
return nums;
}
};
int main() {
vector<int> nums = { 2,6,3,1,7,4,9,5,8,10};
solution s;
vector<int>result = s.heapSort(nums);
cout << "排序重建堆:" << endl;
for (int i :result)
cout <<i << ' ';
cout << endl;
return 0;
}
说明:
1、第一步初始化大顶堆,由heapSort函数中第一个for循环完成,此时该堆结构的所有节点都大于其左右子节点的值(如果子节点存在的话),然后就开始利用大顶堆这个数据结构完成排序
2、排序就是将每个元素放到它该在的位置上,将堆顶元素和堆的最后一个元素交换,这样最大的元素就到了它应该在的位置上了,但是将打乱大顶堆结构的那个元素(堆顶元素)下沉,使得保持大顶堆的数据结构(这样次大的元素就到了堆顶位置…)