思维更重要:希尔排序

希尔排序

简介

希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序

思路

/**
 * 希尔排序是插入排序的一种。<br/>
 * 也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法<br/>
 *<br/>
 * 思路:如序列 9 8 7 6 5 4 3 2 1<br/>
 *      确定一个增量序列,如 4(length/2) 2 1 ,从大到小使用增量<br/>
 *      使用第一个增量,将序列划分为若干个子序列,下标组合为0-4-8,1-5,2-6,3-7<br/>
 *      依次对子序列使用直接插入排序法;<br/>
 *      使用第二个增量,将序列划分为若干个子序列(0-2-4-6-8),(1-3-5-7)<br/>
 *      依次对子序列使用直接插入排序法:<br/>
 *      使用第三个增量1,这时子序列就是元序列(0-1-2-3-4-5-6-7-8),使用直接插入法<br/>
 *      完成排序。<br/>
 * 时间复杂度:不太确定在O(nlogn)~O(n²)之间<br />
 * 空间复杂度:O(1)<br />
 * 原址排序<br />
 * 稳定性:由于相同的元素可能会被划分至不同子序列单独排序,因此稳定性是无法保证的——不稳定<br />
 *
 * */

我的代码

public class 希尔排序 {
	
	public static void main(String[] args) {
		int[] arr = {9, 9, 6, 7, 5, 4, 2, 2, 1};
	    shellSort(arr);
	    for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] +  " ");
		}
	}
	
	private static void shellSort(int[] arr){
		//不断缩小增量
		//  interval是增量的意思 ,以arr的长度的一半开始,每次都要缩小一半
		for (int interval = arr.length/2; interval > 0; interval=interval/2) {
			//将增量为1的插入排序修改一下
			for (int i = interval; i < arr.length; i++) {
				int x = arr[i];
				int index = i - interval;
				while (index > -1 && x < arr[index]) {
					arr[index+interval]=arr[index];
					index-=interval;
				}
				arr[index+interval]=x;
			}
		}
	}
}

发布了60 篇原创文章 · 获赞 4 · 访问量 1285

猜你喜欢

转载自blog.csdn.net/qq_43966129/article/details/104975244