java排序之shell排序

之前的几篇关于排序的算法都是比较简单的排序,虽然不一定可以写出来,但是一眼就可以看懂,接下来的几篇的排序可能就需要仔细思考一下,或者画图描绘一下了,这篇文章讲的死shell排序,也叫增量排序,它的本质是插入排序,通过将数组数组的方式来将增加排序的速度,分组的方式第一次将数组的长度/2,第二次/4,当结果等于1的时候,那么将这个数组进行插入排序就完成了排序,当然分组时也是需要排序的,所以我认为这个和快排和归并是差不多的,大家理解一下吧,贴代码了。

package www.jk.shell;

import java.util.Arrays;

public class Test {

	/**
	 * @author jk,这个代码写的是shell排序,其实我个人认为这个排序的思想是把归并和快排的思想结合起来,快排是通过
	 *         第一个元素来进行左右划分,归并是无论什么样,先将数组分成两组,然后继续分最后结合起来,这个shell排序,首先是将数组
	 *         分为两组,然后进行插入,其实就类似将大的或者小的先放在前面或者后面,所以,我认为这个算法的复杂度应该和归并和快排是差不多的
	 * 
	 */
	public static void main(String[] args) {
		int[] a = { 1, 4, 2, 0, 8, 6, 4, 6 };
		shellSort(a);
		// 输出排序后的数组
		System.out.println(Arrays.toString(a));

	}

	private static void shellSort(int[] a) {
		// 将数组分组
		for (int r = a.length / 2; r >= 1; r /= 2) {
			// 这里的思路和插入排序的思路相同,通过找到前一个的数大于或者小于来进行插入
			for (int i = r; i < a.length; i += r) {
				int temp = a[i];
				int j = i - r;
				while (j >= 0 && temp < a[j]) {
					a[j + r] = a[j];
					j -= r;
				}
				a[j + r] = temp;
			}
		}

	}

}


你可能感兴趣的:(java基础算法)