LeetCode912-排序数组

方式1:直接插入排序

class Solution {
    public int[] sortArray(int[] nums) {

            if(nums==null){
                return nums;
            }

            for(int i=1;i<nums.length;i++){
                int j=i-1;
                int temp=nums[i];
                for(;j>=0;j--){
                    if(nums[j]>temp){
                        nums[j+1]=nums[j];
                    }else{
                        break;
                    }
                }
                nums[j+1]=temp;
            }

            return nums;

    }
}

方式2:希尔排序

class Solution {
    public int[] sortArray(int[] nums) {

            int gap=nums.length;
            while(gap>1){
                gap=gap/2;
                shell(nums,gap);
            }
            shell(nums,1);

            return nums;

    }


    public static void shell(int [] nums  ,  int gap){

            for(int i=gap;i<nums.length;i++){

                int j=i-gap;
                int temp=nums[i];

                for(;j>=0;j-=gap){
                    if(nums[j]>temp){
                        nums[j+gap]=nums[j];
                    }else{
                        break;
                    }
                }

                nums[j+gap]=temp;
            }

    }

}

方式3:选择排序

过不了LeetCode,因为时间超过限制。

class Solution {
    public int[] sortArray(int[] nums) {
            for(int i=0;i<nums.length;i++){
                int j=i+1;
                int minIndex=i;
                for(;j<nums.length;j++){
                    if(nums[j]<nums[minIndex]){
                        minIndex=j;
                    }
                }
                swap(nums,i,minIndex);
            }
            return nums;

    }

    public static void swap(int [] nums, int i,int minIndex){
        int temp=nums[i];
        nums[i]=nums[minIndex];
        nums[minIndex]=temp;
    }

}

方式4:堆排序

从小到大的顺序需要建立最大堆

class Solution {
    public int[] sortArray(int[] nums) {

            if(nums==null){
                return nums;
            }

            create(nums);

            int end=nums.length-1;

            while(end>0){
                int temp=nums[0];
                nums[0]=nums[end];
                nums[end]=temp;
                shift(nums,0,end);
                end--;
            }

            return nums;


    }

    public static void create(int []  nums){
            int parent=(nums.length-1-1)/2;
            for(;parent>=0;parent--){
                shift(nums,parent,nums.length);
            }
    }

    public static void shift(int [] nums,int parent ,int len){

            //左孩子
            int child=parent*2+1;
           

            while(child<len){
                 if(child+1<len&&nums[child+1]>nums[child]){
                child++;
            }
            if(nums[child]>nums[parent]){
                int temp=nums[child];
                nums[child]=nums[parent];
                nums[parent]=temp;
                parent=child;
                child=parent*2+1;
            }else{
                break;
            }
            }
    }

}

方式5:冒泡排序

class Solution {
    public int[] sortArray(int[] nums) {

        boolean flag=false;
        int temp=0;
        
      for(int i=0;i<nums.length-1;i++){
          flag=false;
          for(int j=0;j<nums.length-1-i;j++){
              if(nums[j]>nums[j+1]){
                  temp=nums[j];
                  nums[j]=nums[j+1];
                  nums[j+1]=temp;
                  flag=true;
              }
          }
          if(flag=false){
              break;
          }
      }

      return nums;
    }

}

方式6:快速排序

递归实现:

class Solution {
    public int[] sortArray(int[] nums) {

            quick(nums,0,nums.length-1);

            return nums;
     
    }

    public void quick(int []  nums, int s, int e){

        if(s>=e){
            return;
        }

        int mid=part(nums,s,e);

        quick(nums,s,mid-1);
        quick(nums,mid+1,e);

    }

    public int  part(int[] nums,int s, int e){

            int temp=nums[s];

            while(s<e){
                
                while(s<e && nums[e]>=temp){
                    e--;
                }

                nums[s]=nums[e];

                while(s<e && nums[s]<=temp){
                    s++;
                }
                
                nums[e]=nums[s];

            }

            nums[e]=temp;

            return e;

    }

}

非递归方式:

class Solution {
    public int[] sortArray(int[] nums) {

           Stack<Integer>stack=new Stack<>();

            int s=0;
            int e=nums.length-1;

            int mid=part(nums,s,e);

            if(s+1<mid){
                stack.push(s);
                stack.push(mid-1);
            }

            if(e-1>mid){
                stack.push(mid+1);
                stack.push(e);
            }

            while(!stack.isEmpty()){

                e=stack.pop();
                s=stack.pop();
                mid=part(nums,s,e);


                 if(s+1<mid){
                stack.push(s);
                stack.push(mid-1);
            }

            if(e-1>mid){
                stack.push(mid+1);
                stack.push(e);
            }

            }

            return nums;
    }



    public int  part(int[] nums,int s, int e){

            int temp=nums[s];

            while(s<e){
                
                while(s<e && nums[e]>=temp){
                    e--;
                }

                nums[s]=nums[e];

                while(s<e && nums[s]<=temp){
                    s++;
                }
                
                nums[e]=nums[s];

            }

            nums[e]=temp;

            return e;

    }

}

方式7:归并排序

递归方式:

class Solution {
    public int[] sortArray(int[] nums) {
            magerFunc(nums,0,nums.length-1);
            return nums;
    }

    public static void  magerFunc(int [] nums, int low , int high){

            if(low>=high){
                return;
            }

            int mid=(low + high) >>> 1;
            
            magerFunc(nums,low,mid);
            magerFunc(nums,mid+1,high);

            marge(nums,low,high,mid);

    }

    public static void marge(int[] nums, int low, int high, int mid){

            int[] temp=new int[high-low+1];
            int k=0;
            int s1=low;
            int e1=mid;
            int s2=mid+1;
            int e2=high;

            while(s1<=e1 && s2<=e2){
                if(nums[s1]<=nums[s2]){
                    temp[k++]=nums[s1++];
                }else{
                    temp[k++]=nums[s2++];
                }
            }

            while(s1<=e1){
                temp[k++]=nums[s1++];
            }

            while(s2<=e2){
                temp[k++]=nums[s2++];
            }

            for(int i=0;i<k;i++){
                nums[low+i]=temp[i];
            }


    }

}

非递归:

class Solution {
    public int[] sortArray(int[] nums) {
     

     int gap=1;

        while(gap<nums.length){
            

                for(int i=0;i<nums.length;i+=2*gap){
                    
                    int low=i;
                    int mid=low+gap-1;
                    if(mid>=nums.length){
                        mid=nums.length-1;
                    }
                    int high=mid+gap;
                    if(high>=nums.length){
                        high=nums.length-1;
                    }

                    marge(nums,low,high,mid);
                }

                gap=2*gap;


        }

        return nums;

   
    }

    public static void marge(int[] nums, int low, int high, int mid){

            int[] temp=new int[high-low+1];
            int k=0;
            int s1=low;
            int e1=mid;
            int s2=mid+1;
            int e2=high;

            while(s1<=e1 && s2<=e2){
                if(nums[s1]<=nums[s2]){
                    temp[k++]=nums[s1++];
                }else{
                    temp[k++]=nums[s2++];
                }
            }

            while(s1<=e1){
                temp[k++]=nums[s1++];
            }

            while(s2<=e2){
                temp[k++]=nums[s2++];
            }

            for(int i=0;i<k;i++){
                nums[low+i]=temp[i];
            }


    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值