【Java】Java实现希尔排序

概述

希尔排序是一种基于插入排序的快速排序算法。如果还未掌握插入排序的可以参考我的文章:https://blog.csdn.net/weixin_45434953/article/details/104240071
对于大规模的乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组的一端移动到另一端。

希尔排序为了加快速度简单地改进了插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。希尔排序的思想是使数组中任意像个为h的元素都是有序的。这样的数组被称为h有序数组。

想要简单明了描述希尔排序有点难(我也想了很久),建议不太明白的同学直接去看这两个希尔排序可视化的视频:(建议先看第一个再看第二个,第一个更直观,第二个贴近代码)
https://www.bilibili.com/video/av17062242?from=search&seid=16178959150156651996
https://www.bilibili.com/video/av78643596?from=search&seid=16178959150156651996

代码展示

package Sort;

import java.util.*;

public class Shell_Sort {
	public static void sort(Comparable[] a) {
		int N = a.length;//获取输入数组长度
		int h = 1;//增量h
		while (h < N/3)
			h = 3*h + 1;
		while ( h >= 1 ) {
			//将数组变为h有序
			for ( int i = h; i<N; i++) {
				//将a[i]插入到a[i-h],a[i-2h],a[i-3h]...之中
				//回溯操作,将a[i]插入到h有序数组中的正确位置
				for (int j = i; j>=h && a[j].compareTo(a[j-h])<0; j-=h ) {
					Comparable t = a[j];
					a[j] = a[j-h];
					a[j-h] = t;
				}
			}
			h = h/3;
		}
	}
	
	//用于打印展示数组的方法
	private static void show(Comparable[] a) {
		for (int i = 0; i<a.length; i++) 
			System.out.print(a[i]+" ");
		System.out.println();
	}

	//用例
	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		String in = reader.nextLine();
		String[] a = in.split(" ");
		sort(a);//调用上面的选择排序方法
		show(a);
	}
}

输入输出结果:
输入
S H E L L S O R T E X A M P L E
输出
A E E E H L L L M O P R S S T X

排序成功!

发布了4 篇原创文章 · 获赞 3 · 访问量 258

猜你喜欢

转载自blog.csdn.net/weixin_45434953/article/details/104248358