希尔排序JAVA实现
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; } }