1.快速排序
//快速排序
void quick_sort(vector<int> &nums)
{
quick_sort(nums,0,nums.size()-1);
return;
}
void quick_sort(vector<int> &nums,int start,int end)
{
//元素<=2个退出
if(start >= end)
return;
if(start +1 == end){
if(nums[start]>nums[end])
swap(nums[start],nums[end]);
return;
}
//分治
int pos = partition(nums,start,end);
//递归
quick_sort(nums,start,pos-1);
quick_sort(nums,pos+1, end);
return ;
}
int partition(vector<int> &nums,int start,int end)
{
int key;
int l,r;
key = nums[end];
l = start;
r = end;
while(l<r){
//循环顺序不能颠倒,先从左边开始循环,保证最后循环终止的时候,指针停在>=key的值上,方便与nums[end]交换
while(l<r && nums[l]< key)
l++;
while(l<r && nums[r]>=key)
r--;
swap(nums[l],nums[r]);
}
swap(nums[l],nums[end]);
return l;
}
2.归并排序
//归并排序
void merge_sort(vector<int> &nums)
{
vector<int> tmp(nums.size(),0);
merge_sort(nums,tmp,0,nums.size()-1);
}
void merge_sort(vector<int> &nums,vector<int> &tmp,int start ,int end)
{
//元素个数<=2递归终止
if(start >= end)
return;
if(start +1 == end){
if(nums[start] >nums[end])
swap(nums[start],nums[end]);
return ;
}
int mid,l,r,mer;
mid = (start+end)/2;
//递归
merge_sort(nums,tmp,start,mid);
merge_sort(nums,tmp,mid+1,end);
//合并至临时空间
l = start;
r = mid+1;
mer = start;
while(l<=mid && r<=end){
if(nums[l] < nums[r])
tmp[mer++] = nums[l++];
else
tmp[mer++] = nums[r++];
}
while(l<=mid)
tmp[mer++] = nums[l++];
while(r<=end)
tmp[mer++] = nums[r++];
//复制回原数组
for(int i = start;i<=end;i++)
nums[i] = tmp[i];
return ;
}
3.堆排序
//堆排序
void heap_sort(vector<int> &nums)
{
//自底向上建堆
for(int i = nums.size()/2;i<nums.size();i++){
adjust(nums,nums.size(),i);
}
//就地排序
for(int i = nums.size()-1;i>0;i--){
swap(nums[0],nums[i]);
adjust(nums,i,0);
}
return;
}
//调整函数,将x下标对应的元素做下沉调整
void adjust(vector<int> &nums,int len,int x)
{
int l,r;
while(x<len){
l = x*2+1;
r = x*2+2;
if(r<len && nums[r]>nums[x] && nums[r] > nums[l]){
swap(nums[r],nums[x]);
x = r;
continue;
}
if(l<len && nums[l]>nums[x]){
swap(nums[l],nums[x]);
x = l;
continue;
}
return ;
}
return ;
}