希尔排序 (Java)

希尔排序也是一种插入式排序,是对直接插入排序的一种改进,希尔排序就是将待排序序列分组,这种分组是将相隔某个增量的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。其实这个增量选取还是比较关键的,选取的不当可能导致排序结果不对。可究竟应该取什么增量好,目前还是一个数学难题。

Java版的代码:

package com.qian.sort;

import java.util.Arrays;

public class ShellSort {
	public static void  sort(int[] nums) {
		int increment = nums.length / 2;
		int j;
		while(increment >= 1) {
			
			for (int i = increment; i < nums.length; i++) {
				
				if(nums[i] < nums[i - increment]) { //交换数据
					
					int temp = nums[i];
					for (j = i - increment; j >= 0 && temp < nums[j]; j -= increment) {
						nums[j + increment] = nums[j];
					}
					nums[j + increment] = temp;
				
				}
			}
			
			
			
			increment = increment / 2;
		}
		
		
	}
	public static void main(String[] args) {
		int[] nums = { 2, 7, 8, 3, 1, 6, 9, 0, 5, 10, 15, 12};

		sort(nums);

		System.out.println(Arrays.toString(nums));
		
	}
}


这里的增量选取了increment = increment / 2是一种保险的选择。



复杂度分析:


平均时间复杂度O(n^3/2) ,最好O(n^1.3),最坏O(n^2);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值