当待排序的列表整体呈逆序时(最小的元素在后面),用直接插入排序,会极大的浪费时间,故提出希尔排序(ShellSort)
首先将数组分成len/2组,即增量gap = len/2,然后对每一组进行直接插入排序;然后继续将数组分成gap=gap/2组,然后对每一组进行直接插入排序...直到gap = 1;为止
package Sort;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class ShellSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
ShellSort shellSort = new ShellSort();
int[] arr = new int[80000];
for(int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random()*80000000);
}
Date date1 = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String data1sString = simpleDateFormat.format(date1);
System.out.println("前:"+data1sString);
shellSort.shellSort(arr);
Date date2 = new Date();
String data2sString = simpleDateFormat.format(date2);
System.out.println("后:"+data2sString);
// System.out.println(Arrays.toString(arr));
}
public void shellSort(int[] arr) {
if(arr.length == 0) {
return;
}
int temp;
//方法一:用交换方法(for)
for(int gap = arr.length/2; gap > 0; gap /= 2) {
for(int i = gap; i < arr.length; i++) {//无序列表
for(int j = i-gap; j >= 0; j -= gap) {//有序列表
if(arr[j] > arr[j+gap]) {
temp = arr[j+gap];
arr[j+gap] = arr[j];
arr[j] = temp;
}else {
break;
}
}
}
}
//方法一:用交换方法(while)
// int j;
// for(int gap = arr.length/2; gap > 0;gap /= 2) {
// for(int i = gap; i < arr.length; i++) {//无序
// j = i - gap;//有序
// while(j >=0 && arr[j] > arr[j+gap]) {
// temp = arr[j];
// arr[j] = arr[j+gap];
// arr[j+gap] = temp;
// j -= gap;
// }
// }
// }
//
//方法二:用移动法(while)
// int j;
// for(int gap = arr.length/2; gap > 0; gap /= 2) {
// for(int i = gap; i < arr.length; i++) {
// temp = arr[i];//无序列表中的第一个元素(待插入)
// j = i - gap;//有序列表中的最后一个元素
// while(j >= 0 && arr[j] > temp) {
// arr[j+gap] = arr[j];
// j -= gap;
// }
// if(j != i-gap) {
// arr[j+gap] = temp;
// }
// }
// }
}
}