leetcode 912. 排序數組——解法彙總,計數排序o(n),快速排序、歸併排序、堆排序

題目鏈接傳送門

說明

代碼

class Solution {
    public int[] sortArray(int[] nums) {
        //排序?
        //計數排序o(n)
        // sortTong(nums);
        //歸併
        // int[] temp=new int[nums.length];
        // sortGuibing(nums,temp,0,nums.length-1);
        //快排,
        // sortQuick(nums,0,nums.length-1);
        //堆排序
        sortHeapMax(nums);
        //希爾,都是o(n*logn)
        return nums;
    }

    //計數排序
    public void sortTong(int[] nums){
        int[] a=new int[100000+5];
        for(int i=0;i<nums.length;i++){
            a[nums[i]+50000]++;
        }
        int p=0;
        for(int i=0;i<a.length;i++){
            while(a[i]>0){
                nums[p++]=i-50000;
                a[i]--;
            }
        }
    }
    //手撕快排
    
    public int partion(int[] nums,int l,int r){
        int x=nums[l];
        int i=l;
        for(int j=l+1;j<=r;j++){
            if(nums[j]<=x){
                i++;
                int temp=nums[i];nums[i]=nums[j];nums[j]=temp;
            }
        }
        nums[l]=nums[i];
        nums[i]=x;
        return i;
    }
    public void sortQuick(int[] nums,int l,int r){
        if(l>=r)return;
        int k=partion(nums,l,r);
        sortQuick(nums,l,k-1);
        sortQuick(nums,k+1,r);
        return;
    }
    // public partition
    //堆排序
    public void maxHeapify(int[] nums,int i,int len){
        while((i<<1)+1<=len){//有子節點
            int lson=(i<<1)+1;//左兒子
            int rson=(i<<1)+2;//右兒子
            int large=i;
            if(lson<=len&&nums[lson]>nums[large]){
                large=lson;
            }
            if(rson<=len&&nums[rson]>nums[large]){
                large=rson;
            }
            if(large==i)break;
            //交換i與large
            int temp=nums[i];nums[i]=nums[large];nums[large]=temp;
            i=large;
        }

    }
    public void biuldMaxHeap(int[] nums,int len){
        //從下向上建堆
        for(int i=len/2;i>=0;i--){
            maxHeapify(nums,i,len);
        }
    }
    public void sortHeapMax(int[] nums){
        int len=nums.length-1;
        biuldMaxHeap(nums,len);
        for(int i=len;i>=1;i--){
            int temp=nums[i];nums[i]=nums[0];nums[0]=temp;
            len--;
            maxHeapify(nums,0,len);
        }
        // while(len>0){
        //     int temp=nums[len];nums[len]=nums[0];nums[0]=temp;
        //     len--;
        //     maxHeapify(nums,0,len);
        // }
        return;
    }
    //歸併sortGuibing(a,b,l,r)代表a[l,r]進行排序b爲臨時數組
    public void sortGuibing(int[] nums ,int[] temp,int l,int r){
        if(l>=r)return;
        int mid=(l+r)>>1;
        sortGuibing(nums,temp,l,mid);
        sortGuibing(nums,temp,mid+1,r);
        int i=l,j=mid+1,p=l;
        while(i<=mid&&j<=r){
            if(nums[i]<nums[j])temp[p++]=nums[i++];
            else temp[p++]=nums[j++];
        }
        while(i<=mid)temp[p++]=nums[i++];
        while(j<=r)temp[p++]=nums[j++];
        for(int k=l;k<=r;k++){
            nums[k]=temp[k];
        }
        return;
    }
    //希爾
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章