基础算法系列之排序算法-3. 直接插入排序 并用其解决HDU 1106 排序

      我们之前已经学习了冒泡排序和二分查找两种基本算法,本篇文章我们将一起学习下一个基础算法——直接插入排序算法。


 直接插入排序

     直接插入排序,从这个名字来看,是不是让你想到了什么场景?!对了,就是打扑克牌的场景,我们每摸一张牌,是不是按照一定的次序插入到现有的牌当中,最后当摸完时,手上的牌就是按一定次序排列了。直接插入排序就是类似我们打扑克牌抓牌的过程。


 直接插入排序的算法思想

     直接插入排序跟冒泡排序一样,是一种最简单的排序算法,其基本操作就是讲一个数插入到已经排好序的序列中,从而得到一个新的,元素数+1的序列,直到插入完最后一个数,就完成了我们的排序工作。


 直接插入排序的实现过程

     我们将序列的第一个元素单独看成一个已知有序序列,逐次将每个数按顺序插入到这个序列中,通过n-1(假设有n个数)次循环,最后得到我们需要的有序序列。


代码实现

public static void straightInsertSort(int[] a) {
		int elements = 1; //记录结果集中元素的个数,起初只有a[0]这一个元素
		for(int i=1;i<a.length;i++){  //从a[1]开始逐个插入
			int j;
			for(j=0;j<elements;j++){  //遍历结果集,逐次与a[i]作比较
				if(a[j] > a[i]){  //若a[j] >a[i],则把结果集从最后位置(即a[elements-1])到j位置逐个向后移动一个位置
					int temp = a[i]; //将要插入的值保留到temp中
					for(int k =elements-1;k>=j;k--){
						a[k+1] = a[k];
					}
					a[j] = temp;    //将要插入的值插入到j位置
					elements++; //结果集元素的个数加1
					break;
				}
			}
			if(j == elements){  //说明结果集中的元素都小于等于a[i],即将a[i]的值插入到末尾
				a[elements] = a[i];
				elements++;
			}

		}
	}

 

让我们运行下面的测试代码,来看看我们写的算法吧。

public static void main(String[] args) {
		int[] a = new int[]{5,3,9,7,6,18,1,16,15};
		straightInsertSort(a);
		for(int i =0;i<a.length;i++){
			System.out.print(a[i]+ "  ");
		}

	}

 

是不是与我们预期的一样呢~既然我们已经学习了直接插入排序算法,老规矩,来做个题练练手吧。


HDU 1106 排序

Problem Description

输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。

你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
 

 

Input

输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。  

输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。

 

Output

对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。

 

Sample Input

0051231232050775

 

Sample Output

0 77 12312320

 

问题分析

       我们可以将我们输入的这串序列保存在字符串中,然后通过字符串的split方法将'5'作为分隔符,将原序列分割为字符串数组,然后通过Integer.praseInt(String str)方法将数组中的每个字符串转化为整数,然后用我们今天学习的直接插入排序算法对这些整数进行排序就解决了。

 

代码

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		String str = input.next(); //将我们输入的序列保存到字符串str中
		String[] strs = str.split("5"); //通过字符串的split方法将5作为分隔符分割原序列
		int[] result = new int[strs.length]; //定义数组result存储这些整数
		for(int i =0;i<result.length;i++){  //通过Integer.parseInt(String str)方法将字符串转为整数
			result[i] = Integer.parseInt(strs[i]);
		}
		straightInsertSort(result); //调用直接插入排序对数组result进行排序
		for(int i =0;i<result.length;i++) {  //打印结果
			System.out.print(result[i]+"  ");
		}


	}

	public static void straightInsertSort(int[] a) {
		int elements = 1; //记录结果集中元素的个数,起初只有a[0]这一个元素
		for(int i=1;i<a.length;i++){  //从a[1]开始逐个插入
			int j;
			for(j=0;j<elements;j++){  //遍历结果集,逐次与a[i]作比较
				if(a[j] > a[i]){   //若a[j] >a[i],则把结果集从最后位置(即a[elements-1])到j位置逐个向后移动一个位置
					int temp = a[i]; //将要插入的值保留到temp中
					for(int k =elements-1;k>=j;k--){
						a[k+1] = a[k];
					}
					a[j] = temp;    //将要插入的值插入到j位置
					elements++; //结果集元素的个数加1
					break;
				}
			}
			if(j == elements){  //说明结果集中的元素都小于等于a[i],即将a[i]的值插入到末尾
				a[elements] = a[i];
				elements++;
			}

		}
	}

 

 让我们测试一下吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值