图解希尔排序并利用Java实现

希尔排序其实是在插入排序的基础之上进行了优化,先将数组简单的排序后在使用插入排序具体过程如下
在这里插入图片描述

第一轮代码实现

for(int i = 0 ; i < array.length/2; i++) {
	if(array[i] > array[i + array.length/2]) {
		int temp = array[i];
		array[i] = array[i + array.length/2];
		array[i + array.length/2] = temp;
	}
}

在这里插入图片描述
在这里插入图片描述

代码实现第二步

for (int i = 2; i < array.length; i += 2) {
	int temp = array[i];
	int count = i;
	for (int j = i-2; j >= 0; j -= 2) {
		if(temp < array[j]) {
			array[(j + 2)] = array[j];
			count = j;
		}
	}
	array[count] = temp;
}
show(array);
for (int i = 3; i < array.length; i += 2) {
	int temp = array[i];
	int count = i;
	for (int j = i-2; j >= 0; j -= 2) {
		if(temp < array[j]) {
			array[j+2] = array[j];
			count = j;
		}
	}
	array[count] = temp;
}

在这里插入图片描述

此时数组相比最开始已经趋于有序最后进行一次插入排序

for (int i = 1; i < array.length; i++) {
	int temp = array[i];
	int count = i;
	for (int j = 0; j < i; j++) {
		if(temp < array[j]) {
			array[(j + 1)] = array[j];
			count = j;
		}
	}
	array[count] = temp;
}

到此希尔排序就完成了,接下来我们对代码进行一下优化最终的代码如下
版本一

public static void sort(int[] array) {
		int grap = array.length;
		while(grap > 0) {
			grap /= 2; //控制分组的个数
			//这个循环用来控制有几个数组,有几个数组就进行几次插入排序
			for(int i = 0 ; i < grap ; i++) { 
				//根据i来遍历每个组的元素进行插入排序
				for(int j = i + grap ; j < array.length ;j += grap) {
					int temp = array[j];
					int x = j - grap;
					while(x >= 0 && temp < array[x]) {
						array[x + grap] = array[x];
						x -= grap;
					}
					array[x + grap] = temp;
				}
			}
		}
	}

版本二

public static void sort(int[] arr) {
		for(int i = arr.length/2 ; i > 0 ; i /= 2) {
			for(int j = i ; j < arr.length ; j++) {
				for(int a = j -i ; a >= 0 ; a -= i) {
					if(arr[a] > arr[a + i]) {
						int temp = arr[a];
						arr[a] = arr[a + i];
						arr[a + i] = temp;
					}
				}
			}
		}
	}

版本三

public static void sort(int[] arr) {
		for(int grap = arr.length/2 ; grap > 0 ; grap /= 2) {
			for(int i = grap ; i < arr.length ; i++) {
				int temp = arr[i];
				int index = i;
				for(int j = i -grap ; j >= 0 ; j -= grap) {
					if(temp < arr[j]) {
						arr[j + grap] = arr[j];
						index = j;
					}
					
				}
				arr[index] = temp;
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值