package com.company.sort;
/*
希尔排序
针对直接插入排序的下效率问题,有人对次进行了改进与升级,这就是现在的希尔排序。希尔排序,
也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
对于直接插入排序问题,数据量巨大时。
将数的个数设为n,取奇数k=n/2,将下标差值为k的数分为一组,构成有序序列。
再取k=k/2 ,将下标差值为k的书分为一组,构成有序序列。
重复第二步,直到k=1执行简单插入排序。
代码实现:
首先确定分的组数。
然后对组中元素进行插入排序。
然后将length/2,重复1,2步,直到length=0为止
*/
public class sheelSort {
public static int[] sorting(int[] arr){
//int[] arr = {3,2,5,90,22};1 2 6 4
int len = arr.length;
while(len!=0){
len = len/2;
System.out.println("len == " + len);
for(int i = 0; i < len; i++){
for (int j = i + len; j < arr.length; j += len){
System.out.println("j ==" + j);
int k = j - len;
System.out.println("k ==" + k);
int inserNum = arr[j];
while(k >= 0 && arr[k] > inserNum){
arr[k+len] = arr[k];
k-=len;
}
arr[k+len] = inserNum;
}
}
}
return arr;
}
}
package com.company;
import com.company.sort.InsertionSorting;
import com.company.sort.sheelSort;
//import com.company.sort.straightInsertionSorting;
public class Main {
public static void main(String[] args) {
int arr[];
//int intArray[] = new int[]{1, 3, 5, 2, 13, 6};
int[] intArray = {1,2,6,4};
arr = sheelSort.sorting(intArray);
// for(int i=0;i<arr.length;i++) {
// System.out.println(arr[i]);
// }
for(int a:arr){
System.out.println(a);
}
// 解释一下 当一个被除数大于除数时值为0, 当除数大于被除数且被除数
// 直接举例吧 3/2 = 1, 3/3 = 1, 7/2 = 3, 2/3=0
int a2 = 4;
int b = 2;
int c;
c = a2 / b;
System.out.println("c= " + c);
}
}
测试运行时间显示 希尔排序速度优于插入排序速度
package com.company;
import com.company.sort.InsertionSorting;
import com.company.sort.practiceSheelSort;
import com.company.sort.sheelSort;
//import com.company.sort.straightInsertionSorting;
public class Main {
public static void main(String[] args) {
int arr[];
//int intArray[] = new int[]{1, 3, 5, 2, 13, 6};
// int[] intArray = {1,2,6,4};
int[] intArray = gennerateArray(500000);
long startTime = System.currentTimeMillis();
arr = InsertionSorting.insertSort(intArray);
long endTime = System.currentTimeMillis();
// System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
System.out.println("程序运行时间:" + (endTime - startTime)/1000 + "s");
// for(int a:arr){
// System.out.println(a);
// }
}
public static int[] gennerateArray(int log){
// int[] arr=new int[len];
// for(int i=0;i<arr.length;i++){
// arr[i]=(int)(Math.random()*max);
// }
// return arr;
int[] result = new int[log];
for (int i = 0; i < log; i++) {
result[i] = i;
}
for (int i = 0; i < log; i++) {
int random = (int) (log * Math.random());
int temp = result[i];
result[i] = result[random];
result[random] = temp;
}
return result;
}
}