基础算法系列之排序算法-3. 直接插入排序
Posted ACM算法日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础算法系列之排序算法-3. 直接插入排序相关的知识,希望对你有一定的参考价值。
我们之前已经学习了冒泡排序和二分查找两种基本算法,本篇文章我们将一起学习下一个基础算法——直接插入排序算法。
直接插入排序
直接插入排序,从这个名字来看,是不是让你想到了什么场景?!对了,就是打扑克牌的场景,我们每摸一张牌,是不是按照一定的次序插入到现有的牌当中,最后当摸完时,手上的牌就是按一定次序排列了。直接插入排序就是类似我们打扑克牌抓牌的过程。
直接插入排序的算法思想
直接插入排序跟冒泡排序一样,是一种最简单的排序算法,其基本操作就是讲一个数插入到已经排好序的序列中,从而得到一个新的,元素数+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++;
}
}
}
总述
通过本次学习,我们又学会一种基础排序算法——直接插入排序算法,我们的算法水平又前进了一小步呢ヾ(◍°∇°◍)ノ゙
温馨提示
以上是关于基础算法系列之排序算法-3. 直接插入排序的主要内容,如果未能解决你的问题,请参考以下文章