Hark的数据结构与算法练习之希尔排序

算法说明

希尔排序是插入排序的优化版。

插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度。

希尔排序的目的就是通过一个increment(增量)来对数列分组进行交换排序,最终使数列几乎有序,最后再执行插入排序,统计出结果。

通过increment=n/2, 也就是如果9个数的话,增量为4,2,1。   如果是20个数的话,增量就是10,5,2,1。  当increment为1时,其实对几乎有序的数列进行插入排序啦啦。

 

 

 

时间复杂度

O(n2/3)

 

空间复杂度

O(1)

 

代码

使用的是Java

/*
 * 希尔排序
 */
public class ShellSort {
	public static void main(String[] args) {
		int[] arrayData = { 5, 9, 6, 7, 4, 1, 2, 3, 8 };
		ShellSortMethod(arrayData);
		for (int integer : arrayData) {
			System.out.print(integer);
			System.out.print(" ");
		}
	}

	public static void ShellSortMethod(int[] arrayData) {
		int i, j, temp = 0;
		int increment = arrayData.length;
		do {
			increment = increment / 2;  //增量
			for (i = increment; i < arrayData.length; i++) {
				if (arrayData[i] > arrayData[i - increment]) {   //判断是否要进行插入排序
					temp = arrayData[i];  //将要插入的值存放在临时变量中
					
					//这里其实做的就是插入排序,将以增量为步长,往后移动。   
					//temp > arrayData[j] 这个是要注意的,只会移动比要插入的值小的数字
					for (j = i - increment; j >= 0 && temp > arrayData[j]; j -= increment) {
						arrayData[j + increment] = arrayData[j];
					}
					arrayData[j + increment] = temp;
				}
			}
		} while (increment > 0);
	}
}

  

 

结果

9 8 7 6 5 4 3 2 1 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。