C++排序总结——力扣912排序数组

C++排序总结——力扣912排序数组,第1张

C++排序总结——力扣912排序数组
  • 排序方式
    • 快排
    • 归并
    • 堆排序

排序方式 快排
class Solution {
    int sort(vector<int>& nums,int left,int right)
    {
        int pivot=rand()%(right-left+1)+left;
        int temp=nums[left];
        nums[left]=nums[pivot];
        nums[pivot]=temp;
        pivot=nums[left];
        while(left<right)
        {
            while(left<right&&nums[right]>=pivot)
                right--;
            nums[left]=nums[right];
            while(left<right&&nums[left]<=pivot)
                left++;
            nums[right]=nums[left];
        }
        nums[left]=pivot;
        return left;
    }   
    void quick_sort(vector<int>& nums,int left,int right)
    {
        if(left>=right)
            return;
        int mid=sort(nums,left,right);
        quick_sort(nums,left,mid-1);
        quick_sort(nums,mid+1,right);
    }
public:
    vector<int> sortArray(vector<int>& nums) {
        quick_sort(nums,0,nums.size()-1);
        return nums;
    }
};
归并
class Solution {
public:
    vector<int>temp;
    void merge(int l,int r,vector<int>& nums){
        int mid = l + (r-l)/2;
        int i = l,j = mid+1;
        int cnt = 0;
        while(i <= mid && j <= r){
            if(nums[i] <= nums[j]){
                temp[cnt++] = nums[i++];
            }else{
                temp[cnt++] = nums[j++];
            }
        }
        while(i <= mid){
            temp[cnt++] = nums[i++];
        }
        while(j <= r){
            temp[cnt++] = nums[j++];
        }
        for(int k = 0;k <= r-l;++k){
            nums[l+k] = temp[k];
        }
    }
    void merge_sort(int l,int r,vector<int>& nums){
        if(l >= r) return;
        int mid = l + (r-l)/2;
        merge_sort(l,mid,nums);
        merge_sort(mid+1,r,nums);
        merge(l,r,nums);
    }
    vector<int> sortArray(vector<int>& nums) {
        temp.resize(nums.size(),0);
        merge_sort(0,nums.size()-1,nums);
        
        return nums;
    }
};
堆排序
class Solution {
public:
    void build_head(vector<int>& nums,int index,int len){
        int temp = nums[index];
        for(int k = 2*index+1;k < len;k = 2*k+1){
            if(k+1<len && nums[k] < nums[k+1]){
                k++;
            }
            if(nums[k] > temp){
                nums[index] = nums[k];
                index = k;
            }else{
                break;
            }
        }
        nums[index] = temp;
    }
    void head_sort(vector<int>& nums){
        int len = nums.size();
        for(int i = len/2-1;i>=0;--i){
            build_head(nums,i,len);
        }
        for(int i = len-1;i > 0;i--){
            swap(nums[i],nums[0]);
            build_head(nums,0,i);
        }
        
    }
    vector<int> sortArray(vector<int>& nums) {
        head_sort(nums);
        return nums;
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/565295.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存