要点:在插入排序之前,调控数组的顺序 ,减少数据移动。
package org.minos.sort; import java.util.Arrays; public class ShellSort { public static void main(String[] args) { //int[] arr={8,9,1,7,2,3,5,4,6,0}; //shellSort2(arr); //System.out.println(Arrays.toString(arr)); int maxLength=800000; int[] arr=new int[maxLength]; for (int i = 0; i < maxLength; i++) { arr[i]= (int) (Math.random()*maxLength); } long start = System.currentTimeMillis(); shellSort2(arr); long end = System.currentTimeMillis(); System.out.println(end-start); } // 希尔排序交换法 public static void shellSort(int[] arr){ int temp=0; int start=arr.length/2; while (start>0){ for (int i = start; i < arr.length; i++) { for (int j = i - start; j >= 0; j -= start) { if (arr[j] > arr[j + start]) { temp = arr[j]; arr[j] = arr[j + start]; arr[j + start] = temp; } } } System.out.println(Arrays.toString(arr)); start=start/2; } } //希尔排序法->移位法 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 tem=arr[j]; if(arr[j]<arr[j-gap]){ while (j-gap>=0&&tem<arr[j-gap]){ // 移动 arr[j]=arr[j-gap]; j-=gap; } // 当退出while后,就给temp找到插入的位置 arr[j]=tem; } } } } }