java排序——插入排序

package jxau.blueDot.lyx;

/**
 * 
 * @author lyx
 *	@下午6:42:21
 * @TODO:
 * 	希尔排序
 */

/**
 * 
 * 	把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序,
 * 小组的个数逐次缩小,当完成了所有数据元素都在一个组内排序完成后结束。希尔排序
 * 又被称为 缩小增量排序。
 * 	希尔排序是在分组概念上的直接插入排序,即在不断缩小组的个数时把原各小组的
 * 数据元素插入到新组中的合适位置上。
 */

/**
 * 第一次增量为6
 * 初始关键字序列
 * 	65  34  25  87  12  38  56  46  14  77  92  23
 * 	——                      ——           
 * 第一次希尔排序结果
 * 	56  34  14  77  12  23  65  46  34  87  92  38
 * 
 * 第二次增量为3
 * 第二次希尔排序结果
 * 	56  12  14  65  34  23  77  46  25  87  92  38
 * 
 * 第三次增量为1
 * 第三次希尔排序结果
 * 	12  14  23  25  34  38  46  56  65  77  87  92
 * 
 */

/**
 * 
 * 算法时间复杂度
 * 	O(n(logn)^2) 
 */

public class ShellSort {

	public static int count = 0;  
	
	public static void shellSort(int[] data) {  
		
        // 计算出最大的h值  	(相当于增量的值)
		
		/**
		 * 常用的h序列由Knuth提出,该序列从1开始,通过如下公式产生:
		 *	h = 3 * h +1
		 *	反过来程序需要反向计算h序列,应该使用
		 *	h=(h-1)/3
		 */
		
        int h = 1;  
        while (h <= data.length / 3) {  
            h = h * 3 + 1;  
        }  
        
        while (h > 0) {  
        	
            for (int i = h; i < data.length; i += h) { 
            	
                if (data[i] < data[i - h]) {  
                	
                    int tmp = data[i];  
                    int j = i - h;  
                    
                    while (j >= 0 && data[j] > tmp) {  
                        data[j + h] = data[j];  
                        j -= h;  
                    }  
                    
                    data[j + h] = tmp;  
                    print(data);  
                }  
            }  
            // 计算出下一个h值  
            h = (h - 1) / 3;  
        }  
    }  
  
    public static void print(int[] data) {  
    	
        for (int i = 0; i < data.length; i++) {  
            System.out.print(data[i] + "\t");  
        }  
        
        System.out.println();  
    }  
}


你可能感兴趣的:(java排序——插入排序)