希尔排序

算法思想

      一、先取一个小于n的整数d1做为第一个增量,把序列分红d1个组。 java

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

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

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

实例演示

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

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

代码实现

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+" ");
		}

	}

}
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息