前言
记录一下最近学习的堆排序和归并排序,方便以后复习。
堆排序
排序代码
void adjustHeap(vector<int>& nums, int star, int end) {
int father = star;
int child = 2 * father + 1;
while (child < end) {
if (child + 1 < end && nums[child] < nums[child + 1]) {
child++;
}
if (nums[father] < nums[child]){
Swap(nums[father], nums[child]);
}
else {
return;
}
father = child;
child = 2 * child + 1;
}
}
void heapSort(vector<int> &nums){
int n = nums.size();
for (int i = n / 2 - 1; i >= 0; i--) {
adjustHeap(nums, i, nums.size());
}
while (n - 1) {
Swap(nums[0], nums[n - 1]);
adjustHeap(nums, 0, --n);
}
}
相似问题(找最小k个元素)
这个是leetcode中的面试题 17.14. 最小K个数
class Solution {
public:
void adjust(vector<int>& arr, int star, int end){
int father = star;
int child = 2 * father + 1;
while(child < end){
if(child + 1 < end && arr[child] < arr[child + 1]){
child++;
}
if(arr[child] > arr[father]){
swap(arr[father], arr[child]);
}
else{
return;
}
father = child;
child = 2 * child + 1;
}
}
vector<int> smallestK(vector<int>& arr, int k) {
int len = arr.size();
vector<int> help;
int i;
if(len == 0 || k < 0) return help;
for(i = k / 2 - 1; i >= 0; i--){
adjust(arr, i, k);
}
for(i = k; i < len; i++){
if(arr[i] < arr[0]){
arr[0] = arr[i];
adjust(arr, 0, k);
}
}
for(i = k - 1; i >= 0; i--){
help.push_back(arr[i]);
}
return help;
}
};
这两段代码中的调整最小堆的代码(即adjust和adjustHeap)一样的,此处添加这段代码方便理解。
归并排序
void merge(vector<int>& nums, int star, int mid, int end) {
int i = star, j = mid + 1, index = 0;
int* help = new int[end - star + 1];
while (i <= mid && j <= end) {
if (nums[i] < nums[j]) {
help[index++] = nums[i++];
}
else {
help[index++] = nums[j++];
}
}
while (i <= mid) {
help[index++] = nums[i++];
}
while (j <= end) {
help[index++] = nums[j++];
}
index = star;
for (i = 0; i <= end - star; i++) {
nums[index++] = help[i];
}
delete[] help;
}
void mergeSort(vector<int>& nums, int star, int end) {
if (star >= end) {
return;
}
int mid = (end + star) / 2;
mergeSort(nums,star, mid);
mergeSort(nums, mid + 1, end);
merge(nums, star, mid, end);
}