希尔排序

算法思想

      1、先取一个小于n的整数d1作为第一个增量,把序列分成d1个组。

      2、所有距离为d1的倍数元素放在同一个组中,在各组内警醒直接插入排序。

      3、取第二个增量d2<d1重复尚需的分组和排序。

      4、直至所取的增量dt=1(dt<dt-1<···· <d2<d1),即所有元素都放在同一组中进行插入排序为止。

实例演示

第一次,d1=5; 第二次,d2=3; 第三次 , d3=1; 

动画中相同颜色为一组,组内先执行插入排序。

代码实现

package test.algorithm.FastSlowPointer;

public class ShellSort {
	
	/**
	 * 希尔排序
	 * @param list
	 */
	public static void shellSort(int[] list){
		int gap = list.length;
		int temp = 0;
		do{
			//增量
			gap = gap/3 + 1;
			for(int i = gap;i<list.length;i++){
				
				if(list[i]<list[i-gap]){
					temp = list[i];
					int j = i-gap;
					
					//比第i个大的元素全部向后移动gap位
					//空出的位置是j+gap
					while(j>=0 && list[j]>temp){
						list[j+gap] = list[j];
						j = j-gap;
					}
					
					//插入第i个元素
					list[j+gap] = temp;
				}
			}
			
		}while(gap>1);
	}
	
	public static void main(String[] args) {
		int[] list = {5,2,6,0,3,9,1,7,4,8};
		shellSort(list);
		
		System.out.print("打印数组:");
		for(int i :list){
			System.out.print(i+" ");
		}

	}

}




你可能感兴趣的:(希尔排序)