【算法系列】——Java实现插入&&希尔排序

插入排序

   定义

    将一个数据插入到已经排好序的有序数据中,插入排序巧用之前的序列,从而简化排序的过程,提高效率。

图解插入排序

    

程序代码实现

/**  
  * @Title:  insertSort.java
  * @Package cn.xiaojia.test
  * @Description: 
  * @author 贾文静
  * @date  2017年8月11日 下午8:58:02
  * @version V1.0  
  * Update Logs:
* ****************************************************
* Name:
* Date:
* Description:
******************************************************
*/
package cn.xiaojia.test;

public class insertSort {
	public static void main(String[] args) {
		int[] a = { 51, 46, 20, 18, 65, 97, 82, 30, 77, 50 };
		System.out.print("排序原始数据:");
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
		System.out.println();
		insert(a);
		System.out.print("排序结果展示:");
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
	}
	public static void insert(int[] a){
		for (int i = 1; i < a.length; i++) {
			int currentValue = a[i];
			int position = i;
			for (int j = i-1; j >=0; j--) {
				if (a[j]>currentValue) {
					//比当前值大,坐标向后移动一位
					a[j+1]=a[j];
					//此时比较的坐标向前移动,该坐标位的数据已经被记录
					position--;
				}else {
					break;
				}
				a[position]=currentValue;
			}
			System.out.print("排序过程第"+i+"趟");
			for (int j = 0; j < a.length; j++) {
				System.out.print(a[j]+" ");
			}
			System.out.println();
		}
	}
}

根据代码结果分析


插入排序的有序区和无序区其实和选择排序是一致。

希尔排序

   定义

    希尔排序又称为缩小增量排序。把数据按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

图解希尔排序

     

程序代码实现

/**  
  * @Title:  shellSort.java
  * @Package cn.xiaojia.test
  * @Description: 
  * @author 贾文静
  * @date  2017年8月8日 下午6:55:24
  * @version V1.0  
  * Update Logs:
* ****************************************************
* Name:
* Date:
* Description:
******************************************************
*/
package cn.xiaojia.test;

import javax.xml.transform.Templates;

public class shellSort {
	public static void main(String[] args) {
		int[] a = { 51, 46, 20, 18, 65, 97, 82, 30, 77, 50 };
		System.out.print("排序原始数据:");
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
		System.out.println();
		shelltest(a);
		System.out.print("排序结果展示:");
		for (int i = 0; i < a.length; i++) {
			System.out.print(a[i]+" ");
		}
	}
	public static void shelltest(int[] data){
		int j,temp;
		int num=0;
		//定义分组,插入中默认为1,所以不要少一层定义的过程
		for (int increment = data.length / 2; increment > 0; increment /= 2){
			//按分组间距比较数据大小
			for (int i = increment; i < data.length; i+=increment) {
				//与插入排序一样,均有在其前的数比较,在插入间距固定,默认从i=1开始,
//				  在希尔中间距是动态的,故用i替代
				 temp=data[i];
				for (j = i-increment; j >=0; j-=increment) {
					if (temp<data[j]) {
						data[j+increment]=data[j];
					}else {
						break;
					}
				}
				data[j+increment]=temp;
			}
			num+=1;
			System.out.print("分组间距为"+increment+"排序过程第"+num+"趟:");
			for (int i = 0; i < data.length; i++) {
				System.out.print(data[i]+" ");
			}
			System.out.println();
		} 

	}
	
}

根据代码分析


发现序列再经过前两次排序后,基本符合正向序列,相比直接插入排序,效率有了明显的提高。

【总结】

    根据排序的思想,以及程序的实现代码,很明显希尔是插入排序的优化,所以在学习的借助基础会变得很容易。一开始的时候直接敲的希尔,很难实现,后来终于开窍了,也明白了为什么希尔中如何融入了插入排序,一步步的都是需要经历的!
    PS:如有理解偏颇之处,欢迎各位拍砖,不胜感激!
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mandy_i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值