package kpp.sort;
/**
* 希尔排序
* 1.设定步长d,每隔d个元素分为一组,组内插入排序;
* 2.d/=2,重复1步骤,直到步长为1
*
* 们知道一次插入排序是稳定的,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。
希尔排序的时间性能优于直接插入排序,原因如下:
(1)当文件初态基本有序时直接插入排序所需的比较和移动次数均较少。
(2)当n值较小时,n和n2的差别也较小,即直接插入排序的最好时间复杂度O(n)和最坏时间复杂度0(n2)差别不大。
(3)在希尔排序开始时增量较大,分组较多,每组的记录数目少,故各组内直接插入较快,后来增量di逐渐缩小,分组数逐渐减少,而各组的记录数目逐渐增多,但由于已经按di-1作为距离排过序,使文件较接近于有序状态,所以新的一趟排序过程也较快。
因此,希尔排序在效率上较直接插人排序有较大的改进。
希尔排序的平均时间复杂度为O(nlogn)。
* @author kpp
*
*/
public class ShellSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int array[] = {49,38,65,97,176,213,227,49,78,34,12,164,11,18,1};
shellSort(array);
for(int k :array){
System.out.println(k);
}
}
private static int shellSort(int data[]){
int len = data.length;
int temp = 0;
for (int increment = len / 2; increment > 0; increment /= 2) {
int j = 0;
for (int i = increment; i < len; i++) {
temp = data[i];
for (j = i-increment; j >= 0; j -= increment) {
if(temp < data[j]){
data[j+increment] = data[j];
}else{
break;
}
}
data[j+increment] = temp;
}
}
return 0;
}
}