java编程题:用Java实现一个希尔排序算法

import java.util.Arrays;

/**
 * java编程题:用Java实现一个希尔排序算法
 * 
 * 基本思想: 首先将待排序的一组数按某个增量分为若干子序列,并对子序列分别进行插入排序。
 * 然后逐渐将增量减小,并重复上述过程。直至增量为1,此时数据序列基本有序,最后进行一次插入排序。
 * 
 */
public class Test {

	public static void main(String[] args) {
		int[] sortNum = {3,82,18,-23,22,19,-62,6,28,31,37,55};
		System.out.println("排序前:"+Arrays.toString(sortNum));
//		shellSort(sortNum);
		shellSort2(sortNum);
		System.out.println("排序后:"+Arrays.toString(sortNum));
	}

	/**
	 * 希尔排序,写法一
	 * 
	 * 思路:三层循环
     * 	第一层循环:控制增量-增量随着程序的进行依次递减一半
     * 	第二层循环:遍历数组
     * 	第三层循环:比较元素,交换元素。
     * 	这里需要注意的是:比较的两个元素和交换的两个元素是不同的。
     * 
	 * @param sortNum
	 */
	private static void shellSort(int[] sortNum) {
		int temp = 0;
		int j = 0;
		// 每次将增量缩短一半
		for (int increment = sortNum.length / 2; increment > 0; increment /= 2) {	//比插入排序多了一层for
			
			//插入排序
			for (int i = increment; i < sortNum.length; i++) {
				temp = sortNum[i];									//待插入元素
				
				/*
				for (j = i; j >= increment; j -= increment) {		
					if (temp < sortNum[j - increment]) {			//若前面元素比待插入元素大,则交换位置
						sortNum[j] = sortNum[j - increment];
					} else {
						break;
					}
				}
				*/
				//对于上面的for循环,还有更简洁的写法
				for (j = i; j >= increment && temp < sortNum[j - increment]; j -= increment) {		
						sortNum[j] = sortNum[j - increment];
				}
				
				/*
				 * 注意不是arr[i] = temp
				 * 直接插入排序也是这样的。
				 * 为什么呢?
				 * 因为j是位置,i是待插入元素
				 */
				sortNum[j] = temp;		//将元素插入到正确的位置
			}
		}
	}
	
	
	/**
	 * 希尔排序,写法二
	 * 
	 * @param sortNum
	 */
	private static void shellSort2(int[] sortNum) {
		int temp = 0;
		int increment = sortNum.length;
		
		while(true){
			increment /= 2;   // 如果数组长度是10的话,那么这里增量是5,3,1共进行三趟排序
			for (int k = 0; k < increment; k++) {
				//下面还是插入排序
				for (int i = k+increment; i < sortNum.length; i+=increment) {
					/*
					for (int j = i; j > k; j-=increment) {
						if(sortNum[j] < sortNum[j-increment]){
							temp = sortNum[j-increment];
							sortNum[j-increment] = sortNum[j];
							sortNum[j] = temp;
						}else{
							break;
						}
					}
					*/
					
					//精简写法
					for (int j = i; j > k && sortNum[j] < sortNum[j-increment]; j-=increment) {
						temp = sortNum[j-increment];
						sortNum[j-increment] = sortNum[j];
						sortNum[j] = temp;
					}
				}
			}
			if(increment==1){
				break;
			}
		}
	}
}


参考:
http://computerdragon.blog.51cto.com/6235984/1161859
http://www.runoob.com/w3cnote/sort-algorithm-summary.html
http://www.cnblogs.com/0201zcr/p/4764427.html
https://my.oschina.net/u/2260184/blog/507857
http://blog.csdn.net/morewindows/article/details/6668714#quote
http://blog.csdn.net/jianyuerensheng/article/details/51258460
http://blog.csdn.net/u014136472/article/details/49248957
http://blog.csdn.net/ls5718/article/details/51809866
http://blog.csdn.net/u010156024/article/details/48932219



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值