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; } } } } }