排序算法之希尔排序(java)

希尔排序是基于插入排序而改进的排序方法。它将数据分为多组,再对各组使用插入排序。

分组依据是增量d,一般增量是  排序元素的长度/2,调用一次插入排序,再继续除2,再调用一次插入排序,再d/2.......直到d <1

希尔排序的时间复杂度为:O(n平方)


思路:

如有下列10个带排序元素:


增增量d = 10/2 = 5,即每隔开5个元素的元素为一组,如下图:


然后调用1次插入排序,再令d/2 = 5/2 = 2 ,即每隔开2个元素的元素为一组


再调用插入排序,d再继续除2,d = 2/2 = 1,即每隔开1个元素的元素为一组,(即一共只有一组元素)


再调用插入排序:


排序完成。


代码:

public class shellSort {
	public static void main(String[] args) {
		int []a = {49,35,32,10,21,54,78};
		ShellSort(a);
		for(int i=0;i<a.length;i++) {
			System.out.print(a[i]+" ");//打印结果:10 21 32 35 49 54 78 
		}
	}
	
	/*希尔排序*/
	private static void ShellSort(int[] array) {
		int length = array.length;
		int d =length;
		
		while(true) {
			d = d/2;
			for(int x=0;x<d;x++) {	//共有d组
				/*每组都进行插入排序*/
				for(int i=x+d;i<length;i=i+d) {
					int temp = array[i];
					int j;
					for(j=i-d;j>=0&&array[j]>temp;j=j-d) {
						array[j+d] = array[j];
					}
					array[j+d]=temp;
				}
			}
			if(d==1)	//若是已完成增量d=1 后的排序,就退出循环
				break;
		}
	}
}


猜你喜欢

转载自blog.csdn.net/u014453898/article/details/80019801