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