欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

排序之希尔排序

程序员文章站 2024-03-16 11:59:16
...

思路:

简单理解:分组+排序

如果想细节理解,看图

排序之希尔排序

主要就是分组,然后两边组中的数据更换.然后再次分组,再次更换,直到分成最小的组.

代码:

@Test
	public void sort() throws Exception {
		// 数据准备
		int[] data = { 12, 10, 2, 4, 5, 9, 13, 10, 8, 1, 4, 5, 3, 8, 11 };
		int d = data.length;
		while (d != 0) {
			// 分组
			d = d / 2;
			for (int i = 0; i < d; i++) {
				for (int j = i + d; j < data.length; j += d) {
					// 获得第二组的第j个的数
					int temp = data[j];
					// 获得第一组的第k个的一个指针
					int k = j - d;
					while (k >= 0 && temp < data[k]) {
//						第二组的第k+d也就是第j个被赋值
						data[k + d] = data[k];
						k -= d;
					}
					//将第一组的第k-d个也就是第i个赋值
					data[k+d] = temp;
				}
			}
		}
		for(int i : data){
			System.out.print(i+"\t");
		}
		
	}

 解析:

代码中最外层的while()来进行分组,里边的两个for进行分组获得数据.最里边的一个while()进行数值的交换

交换代码时,用到的交换语句也是三句

int temp = data[j];   将值保存到一个临时变量中

data[k+d] = data[k];  赋值

data[k+d] = temp;  赋值  

这里的数值交换跟我在直接插入排序中写的是一个意思.只是在直接插入排序中k是+1,而这里是+d,即组的长度