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

 

posted @ 2015-03-27 22:03  kpp  阅读(159)  评论(0编辑  收藏  举报