希尔排序(插入式与位移式优化)

package com.dai.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

import javax.xml.transform.Templates;

public class ShellSort {

    public static void main(String[] args) {
        /*
        int[] arr = {8,9,1,7,2,3,5,4,6,0};
        shellSort(arr);
        int[] arr = new int[80000]; 
        for(int i=0; i<80000; i++) {
            arr[i] = (int)(Math.random()*8000000);
        }
        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1String = simpleDateFormat.format(date1);
        System.out.println("排序前的时间为:" + date1String);
        shellSort(arr);
        Date date2 = new Date();
        String date2String = simpleDateFormat.format(date2);
        System.out.println("排序后的时间为:" + date2String);
*/
        int[] arr = new int[80000]; 
        for(int i=0; i<80000; i++) {
            arr[i] = (int)(Math.random()*8000000);
        }
        Date date1 = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date1String = simpleDateFormat.format(date1);
        System.out.println("排序前的时间为:" + date1String);
        shellSort2(arr);
        Date date2 = new Date();
        String date2String = simpleDateFormat.format(date2);
        System.out.println("排序后的时间为:" + date2String);        
    }
    public static void shellSort(int[] arr) {
        /*
        int temp = 0;
        for(int i=5;i<arr.length; i++) {
            for(int j=i-5;j>=0;j-=5) {
                if(arr[j] > arr[j+5]) {
                    temp = arr[j];
                    arr[j] = arr[j+5];
                    arr[j+5] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
        */
        int temp = 0;
        //int count = 0;
        for( int gap = arr.length/2;gap>0;gap/=2) {
            for(int i=gap;i<arr.length;i++) {
                //遍历各组中的元素(共gap组)
                for(int j=i-gap;j>=0;j-=gap) {
                        if(arr[j] > arr[j+gap]) {
                            temp = arr[j];
                            arr[j] = arr[j+gap];
                            arr[j+gap] = temp;
                        }
                }
            }
            //System.out.println("希尔排序第"+ (++count) + "轮排序结果:" + Arrays.toString(arr));
        }
        
    }
    //对交换式的希尔排序优化:移位法
    public static void shellSort2(int[] arr) {
        //增量gap,并逐步缩小增量
        for(int gap=arr.length/2;gap>0;gap/=2) {
            //从gap个元素开始,逐个对其所在的组进行直接插入
            for(int i=gap;i<arr.length;i++) {
                int j = i;
                int temp = arr[j];
                if(arr[j]<arr[j-gap]) {
                    while(j-gap>=0 && temp < arr[j-gap]) {
                        //移动
                        arr[j] = arr[j-gap];
                        j-=gap;
                    }
                    //退出while循环,就找到了插入的位置
                    arr[j] = temp;
                }
            }
        }
    }
}
原文地址:https://www.cnblogs.com/shengtudai/p/14394254.html