希尔排序的原理,图解,java代码实现

希尔排序

希尔排序就是一种插入排序,又称“缩小增量排序”,是插入排序算法的一种更高效的改进版本。

排序原理

排序原理:

  1. 选定一个增长量h,按照曾长亮h作为分组的依据,对数据进行分组。
  2. 对分好组的每一组数据完成插入排序。
  3. 减少增长量,最小减为1,重复第二步操作。
举例排序过程

对{9,1,2,5,7,4,8,6,3,5}进行排序。如下图
在这里插入图片描述

代码实现

成员方法:

  1. public static boolean greater( int a,int b) 判断a是否大于b,返回true/false
  2. public static void exch(int[] a,int i,int j) 交换数组的索引i处和索引j处的值
  3. public static void sort(int[] a) 对数组a进行希尔排序
    1. 首先确定增长量h
    2. 当h>=1的时候就继续排序,循环所有的待排序的数字。
    3. 内嵌循环则从所有i处往前每次已h递减遍历元素,所有j处的值小于所有j-h处的值,则交换位置,否则,说明不需要交换位置,结束循环。
    4. 每趟排序结束后,h=h/2
import java.util.Arrays;

public class SortShell {

	public static void main(String[] args) {
		int[] array=new int[]{9,1,2,5,7,4,8,6,3,5};
		sort(array);
		System.out.println(Arrays.toString(array));
	}

	/**
	 * 比较两个数之间的大小
	 * @param a
	 * @param b
	 * @return
	 */
	public static boolean greater( int a,int b){
		return a>b;
	}

	/**
	 * 交换两个数的位置
	 * @param a
	 * @param i
	 * @param j
	 */
	public static void exch(int[] a,int i,int j){
		int temp=a[i];
		a[i]=a[j];
		a[j]=temp;
	}

	/**
	 * 希尔排序
	 * @param a
	 */
	public static void sort(int[] a){
		//确定增长量
		int h=1;

		while(h<(a.length/2)){
			h=h*2+1;
		}
		//希尔排序
		while(h>=1){
			//排序
			//找到待插入的元素a[h]
			for(int i=h;i<a.length;i++){
				//将待插入元素插入到有序数列中
				for(int j=i;j>=h;j-=h){

					if(greater(a[j-h],a[j])){
						exch(a,j-h,j);
					}else{
						break;
					}

				}
			}

			h=h/2;
		}

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值