快速排序
#include <iostream>
#include <vector>
using namespace std;
//partiotion算法
int partition(vector<int>&nums,int left,int right){
int pivot=nums[left];
while(left<right){
//从右边找到一个比pivot小的值
while(left<right&&nums[right]>pivot){
--right;
}
nums[left]=nums[right];
//从左边找到一个比pivot大的值
while(left<right&&nums[left]<pivot){
++left;
}
nums[right]=nums[left];
}
nums[left]=pivot;
return left;
}
//快速排序算法
void quickSort(vector<int>& nums,int left,int right){
if(right>left){
//index为本次排序的基点,基点的左边元素小于该基点,基点的右边元素大于该基点
int index=partition(nums,left,right);
quickSort(nums,left,index-1);
quickSort(nums,index+1,right);
}
}
int main(){
vector<int> nums={5,4,3,2,1};
quickSort(nums,0,nums.size()-1);
for(int i=0;i<nums.size();i++){
cout<<nums[i]<<endl;
}
return 0;
}
堆排序
#include <iostream>
#include <vector>
using namespace std;
//https://www.cnblogs.com/wanglei5205/p/8733524.html
//arr 下标:0~n-1
//调整大顶堆
//len:需要建立堆的长度
//index:非叶子节点
void adjust(vector<int> &a,int len,int index){
int left=2*index+1;
int right=2*index+2;
int maxIndex=index;
if(left<len&&a[left]>a[maxIndex]) maxIndex=left;
if(right<len&&a[right]>a[maxIndex]) maxIndex=right;
//index的左右子节点至少有一个大于a[index]
if(maxIndex!=index){
swap(a[index],a[maxIndex]);
//引入maxIndex可能会带来其他新的改变,因此需要再次调整堆呀
adjust(a,len,maxIndex);
}
}
void heapSort(vector<int> &a,int size){
//初始化建立大根堆
for(int i=(size/2)-1;i>=0;i--){
adjust(a,size,i);
}
//正式开始调整大顶堆
for(int i=size-1;i>=0;i--){
swap(a[0],a[i]);
adjust(a,i,0);//将未完成的部分进行堆排序
}
}
int main(){
vector<int> arr={3,2,1,3,4};
heapSort(arr,arr.size());
for(int i=0;i<arr.size();i++){
cout<<arr[i]<<endl;
}
return 0;
}
归并排序
#include <iostream>
using namespace std;
void merge(int arr[],int l,int q,int r){
int n=r-l+1;
int *temp=new int[n];
int left=l;
int right=q+1;
int i=0;
while(left<=q && right<=r){
//最小的
if(arr[left]<=arr[right])
temp[i++] = arr[left++];
else temp[i++] = arr[right++];
}
while(left<=q){
temp[i++] = arr[left++];
}
while(right<=r){
temp[i++] = arr[right++];
}
for(int j=0;j<n;j++){
arr[j+l]=temp[j];
}
delete []temp;
}
void mergeSort(int arr[],int l,int r){
if(l==r){
return ;
}
int q=(l+r)/2;
mergeSort(arr,l,q);
mergeSort(arr,q+1,r);
merge(arr,l,q,r);
}
int main(){
int a[8] = {3,1,2,4,5,8,7,6};
mergeSort(a,0,7);
for(int i=0;i<8;++i)
cout<<a[i]<<" ";
return 0;
}
//#include<iostream>
//
//using namespace std;
//
//void Merge(int arr[], int l, int q, int r){
// int n=r-l+1;//临时数组存合并后的有序序列
// int* tmp=new int[n];
// int i=0;
// int left=l;
// int right=q+1;
// while(left<=q && right<=r)
// tmp[i++] = arr[left]<= arr[right]?arr[left++]:arr[right++];
// while(left<=q)
// tmp[i++]=arr[left++];
// while(right<=r)
// tmp[i++]=arr[right++];
// for(int j=0;j<n;++j)
// arr[l+j]=tmp[j];
// delete [] tmp;//删掉堆区的内存
//}
//
//void MergeSort(int arr[], int l, int r){
// if(l==r)
// return; //递归基是让数组中的每个数单独成为长度为1的区间
// int q = (l + r)/2;
// MergeSort(arr, l, q);
// MergeSort(arr, q + 1, r);
// Merge(arr, l, q, r);
//
//}
//
//int main(){
// int a[8] = {3,1,2,4,5,8,7,6};
// MergeSort(a,0,7);
// for(int i=0;i<8;++i)
// cout<<a[i]<<" ";
//}