记录
https://blog.csdn.net/pilipilipan/article/details/79702298
https://cloud.tencent.com/developer/article/1627749
- 插入排序:
直接插入排序 二分法插入排序 希尔排序 - 交换排序:
冒泡排序(两两交换) 快速排序(pivot 分成两个子序列 一边小 一边大) - 选择排序:
简单选择排序(遍历元素找出一个,然后放前面) 堆排序(构建大根堆或者小根堆) nlogn - 归并排序 logn
2-路归并排序 将位置相邻的有序子序列归并成1个 - 基数排序 桶排序
不是基于比较的算法,先分配到桶,再收集 年月日 排序 适用于关键字确定的
快速排序
void quickSort(vector<int>& data, int low, int high) {
//for_each(data.begin(), data.end(), [](const auto a) {cout << a << " "; });
//cout << endl;
if (low >= high) return;
int key = data[low], begin = low, end = high;
while (begin < end) {
while (begin < end && data[end] > key) {
end--;
}
if (begin < end) data[begin++] = data[end];
while (begin<end && data[begin]<= key) {
begin++;
}
if (begin < end) data[end--] = data[begin];
}
data[begin] = key;
quickSort(data, low, begin - 1);
quickSort(data, begin + 1,high);
}
归并排序
void mergeSort(vector<int>& data, vector<int>& copy, int begin, int end) {
if (begin >= end) return;
int mid = begin + (end - begin) / 2;
int low1 = begin, high1 = mid, low2 = mid + 1, high2 = end, index = begin;
mergeSort(copy, data, low1, high1);
mergeSort(copy, data, low2, high2);
while (low1 <= high1 && low2 <= high2) {
copy[index++] = data[low1] < data[low2] ? data[low1++] : data[low2++];
}
while (low1 <= high1) {
copy[index++] = data[low1++];
}
while (low2 <= high2) {
copy[index++] = data[low2++];
}
}
void mergeTest() {
vector<int> nums = { -5,-10,6,5,12,96,1,2,3 };
vector<int> copy(nums);
mergeSort(nums, copy, 0, nums.size() - 1);
nums.assign(copy.begin(), copy.end());
for_each(nums.begin(), nums.end(), [](const auto& a) {cout << a << " "; });
}
堆排序
#include<iostream>
#include<vector>
using namespace std;
void swap(vector<int>& arr, int a,int b){
arr[a]=arr[a]^arr[b];
arr[b]=arr[a]^arr[b];
arr[a]=arr[a]^arr[b];
}
void adjust(vector<int>& arr,int len,int index){
int maxid=index;
// 计算左右子节点的下标 left=2*i+1 right=2*i+2 parent=(i-1)/2
int left=2*index+1,right=2*index+2;
// 寻找当前以index为根的子树中最大/最小的元素的下标
if(left<len and arr[left]<arr[maxid]) maxid=left;
if(right<len and arr[right]<arr[maxid]) maxid=right;
// 进行交换,记得要递归进行adjust,传入的index是maxid
if(maxid!=index){
swap(arr,maxid,index);
adjust(arr,len,maxid);
}
}
void heapsort(vector<int>&arr,int len){
// 初次构建堆,i要从最后一个非叶子节点开始,所以是(len-1-1)/2,0这个位置要加等号
for(int i=(len-1-1)/2;i>=0;i--){
adjust(arr,len,i);
}
// 从最后一个元素的下标开始往前遍历,每次将堆顶元素交换至当前位置,并且缩小长度(i为长度),从0处开始adjust
for(int i=len-1;i>0;i--){
swap(arr,0,i);
adjust(arr,i,0);// 注意每次adjust是从根往下调整,所以这里index是0!
}
}
int main(){
vector<int> arr={3,4,2,1,5,8,7,6};
cout<<"before: "<<endl;
for(int item:arr) cout<<item<<" ";
cout<<endl;
heapsort(arr,arr.size());
cout<<"after: "<<endl;
for(int item:arr)cout<<item<<" ";
cout<<endl;
return 0;
}