DAY-2 希尔,归并,快排

  • 希尔排序
    在插入排序基础上添加分割点进行二次插排教插入排序效率高
public class xesort {
    public static void main(String [] args){
        int [] arr={5,4,2,9,0,15,11,7,6,8,10,3,1};
        sort(arr);
        print(arr);
    }
//    public static void sort(int [] arr ){
        for(int gap=arr.length/2;gap>0;gap/=2) {//分间隔数组对半开始 arr.length/2-----1
            for (int i = gap; i < arr.length; i++) {
                for (int j = i; j > gap - 1; j -= gap) {//插入排序
                    if (arr[j] < arr[j - gap])
                        swap(arr, j, j - 1);
                }
            }
        }
    }'
        public static void sort(int [] arr ){
        int h=1;
        while(h<arr.length/3){
             h=h*3+1;
        }
        for(int gap=h;gap>0;gap=(gap-1)/3) {//分间隔数组对半开始 arr.length/2-----1
            for (int i = gap; i < arr.length; i++) {
                for (int j = i; j > gap - 1; j -= gap) {//插入排序
                    if (arr[j] < arr[j - gap])
                        swap(arr, j, j - 1);
                }
            }
        }
    }

    static void swap(int [] arr,int i,int j){
        int temp =arr[i];
        arr[i]=arr[j];
        arr[j]=temp;
    }
    static void print(int []arr){
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]+"");
        }
    }
}

  • 归并排序

分治法,先划分再次进行排序较为稳定

//归并排序    分治策略
public class gbsort {
    public static void main(String [] args){
      int []arr={1,4,7,8,3,6,9};
      sort(arr,0,arr.length-1);
      print(arr);
    }
    public static void sort(int [] arr,int left,int right){//递归
        if(left == right) return;
        //分成两半
        int mid = left + (right-left)/2;
        //左排序
        sort(arr, left, mid);
        //右排序
        sort(arr,mid+1 ,right);

        merge(arr,left,mid+1,right);
    }
    static void merge(int []arr, int leftptr, int rightptr, int rightbound){
        //mind :中间点
        int mid = rightptr-1;
        int [] temp = new int[rightbound - leftptr + 1];
        int i = leftptr;
        int j = rightptr;
        int k = 0;
        while(i <= mid && j <= rightbound){
            temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
        }
        while (i <= mid){
            temp[k++] = arr[i++];
        }
        while(j <= rightbound){
            temp[k++] = arr[j++];
        }
       // print(temp);
        for(int m = 0 ; m<temp.length; m++){
            arr[leftptr+m] = temp[m];
        }
    }
    static void swap(int [] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    static void print(int [] arr){
        for (int i=0;i<arr.length;i++) {
            System.out.println(arr[i]+"");
        }
      }
    }


  • 快速排序
    采用递归调用可采用任意值为基准分成左右各半边再对两边进行二次排序重复操作
//快速排序
public class quicklySort {
    public static void main(String [] args){
        int [] arr = {7,3,2,8,1,9,5,4,6,10,6};
        System.out.println("排序前:");
        print(arr);
        sort(arr,0,arr.length-1);
        System.out.println("排序后");
        print(arr);
    }
    public static void sort(int [] arr ,int leftbound , int rightbound){
         if(leftbound >=rightbound){
             return;
         }
        int mid = partition(arr,leftbound,rightbound);
         //递归调用排序左右两边
         sort(arr,leftbound,mid-1);
         sort(arr,mid+1,rightbound);
    }
    static  int  partition(int [] arr ,int leftbound , int rightbound){
        int pivot = arr[rightbound];
        int left = leftbound;
        int right = rightbound-1;
        while(left <= right){
            while (left <= right && arr[left] <= pivot){
                left++;
            }
            while(left <= right && arr[right] > pivot){
                right--;
            }
            if(left < right){
                swap(arr,left,right);
            }
        }
            swap(arr,left,rightbound);
        return left;
    }
    static void swap(int []arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    static void print(int [] arr){
        for(int i = 0;i < arr.length; i++){
            System.out.println(arr[i] + "");
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值