1.我兄弟存在的问题
2.毛遂自荐
希尔排序提希尔(Donald Shell)于1959年提出的一种排序算法。
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
- 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
- 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
3.了解一下我的思想
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
4.交换法之详细分步
public static void shellSort(int[] array) {
//第一轮10/2=5,分5组
for (int i = 5; i < array.length; i++) {
for (int j = i - 5; j >= 0; j -= 5) {
if (array[j] > array[j + 5]) {
int temp = array[j];
array[j] = array[j + 5];
array[j + 5] = temp;
}
}
}
System.out.println("一轮后:" + Arrays.toString(array));
//第二轮 5/2=2.分两组
for (int i = 2; i < array.length; i++) {
for (int j = i - 2; j >= 0; j -= 2) {
if (array[j] > array[j + 2]) {
int temp = array[j];
array[j] = array[j + 2];
array[j + 2] = temp;
}
}
}
System.out.println("二轮后:" + Arrays.toString(array));
//第三轮 2/2=1.分一组
for (int i=1;i< array.length;i++){
for (int j=i-1;j>=0;j-=1){
if (array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
System.out.println("一轮后:"+Arrays.toString(array));
}
}
5.验证一下
int[] array = new int[]{8, 9, 1, 7, 2, 3, 5, 4, 6, 0};
shellSort(array);
6.交换法之归一
public static void shellSort(int[] array) {
for (int gap = array.length / 2; gap > 0; gap /= 2) {//gap分组
//分组:共有array.length / 2 组
for (int i = gap; i < array.length; i++) {
//冒泡比较
for (int j = i - gap; j >= 0; j -= gap) {//gap步长
//比较
if (array[j] > array[j + gap]) {
int temp = array[j];
array[j] = array[j + gap];
array[j + gap] = temp;
}
}
}
}
}
7. 令人惊叹的移位法
public static void shellSort(int[] array) {
for (int gap = array.length / 2; gap > 0; gap /= 2) {
//从第gap个元素开始逐个对其所在的组进行直接插入
for (int i = gap; i < array.length; i++) {
int j = i;
int temp = array[j];
if (array[j] < array[j - gap]) {
while (j - gap >= 0 && temp < array[j - gap]) {
//开始移动,而非交换
array[j] = array[j - gap];
j -= gap;
}
//退出while即找到位置
array[j] = temp;
}
}
}
}
8.看一下的时间
int[] arr = new int[80000];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (Math.random() * 8000000);
}
long start = System.currentTimeMillis();
shellSort(arr);
long end = System.currentTimeMillis();
System.out.println("共需:" + (end - start) + "毫秒");
共需:12毫秒!!!!注意是80w数据啊!!!!amazing~~~~~~~