912. 排序数组(快排、冒泡、归并)

题目描述

leetcode - 912:https://leetcode-cn.com/problems/sort-an-array/

题目描述

解题关键

  • 快排
  • 冒泡
  • 归并

代码

class Solution {

    // 快速排序
    int partition(vector<int>& nums,int l,int r){
        int pos = nums[r];
        int flag = r;
        while(l<r){
            while(nums[l]<=pos&&l<r) l++;
            while(nums[r]>=pos&&l<r) r--;
            swap(nums[l],nums[r]);
        }
        swap(nums[flag],nums[r]);
        return r;
    }

    int randomized_partition(vector<int>& nums,int l,int r){
        int i = rand()%(r-l+1)+l;
        swap(nums[i],nums[r]);
        int pos = partition(nums,l,r);
        return pos;
    }

    void quick_sort(vector<int>& nums,int l,int r){
        if(r>l){
            int pos = randomized_partition(nums,l,r);
            quick_sort(nums,l,pos-1);
            quick_sort(nums,pos,r);
        }
    } 

    // 冒泡排序
    void bubble_sort(vector<int>& nums){
        for(int i=nums.size()-1;i>=0;i--){
            int flag = 0;
            for(int j=0;j<i;j++){
                if(nums[j]>nums[j+1]){
                    flag=1;
                    swap(nums[j],nums[j+1]);
                }
            }
            if(flag==0){
                return;
            }
        }
    }

    // 归并排序
    vector<int> tmp;
    void merge_sort(vector<int>& nums,int l,int r){
        if(l>=r) return;
        int mid = (l+r)/2;
        merge_sort(nums,l,mid);
        merge_sort(nums,mid+1,r);
        
        int cnt = 0;
        int tmpL1 = l;
        int tmpL2 = mid+1;
        while(tmpL1<=mid&&tmpL2<=r){
            if(nums[tmpL1]>nums[tmpL2]){
                tmp[cnt++]=nums[tmpL2++];
            }else{
                tmp[cnt++]=nums[tmpL1++];
            }
        }
        while(tmpL1<=mid){
            tmp[cnt++]=nums[tmpL1++];
        }
        while(tmpL2<=r){
            tmp[cnt++]=nums[tmpL2++];
        }
        for(int i=0;i<r-l+1;i++) nums[i+l]=tmp[i];
    }

public:
    vector<int> sortArray(vector<int>& nums) {
        // quick_sort(nums,0,(int)nums.size()-1);    //快速排序
        // bubble_sort(nums);                        //冒泡排序
        // tmp.resize((int)nums.size(), 0);
        // merge_sort(nums,0,(int)nums.size()-1);    //归并排序
        return nums;
    }
};
posted @ 2020-05-21 17:49  _Sleeping  阅读(115)  评论(0)    收藏  举报