算法,我在路上,将自己了解的算法内容全部梳理一遍!

今天介绍简单点的,插入排序。

首先,什么是插入排序,这个维基百科上有。个人的理解,就是将一个数插入到一个已经排好序的数列当中某个合适的位置,使得增加了一个元素的新的数列依然是有序的。比如,当前有一个待排序的数组A,我们可以认为这个数组是由两部分组成的,一部分是有序的数列B,一部分是无序的数列C,将无序数列中的元素逐个的取出,添加到有序数列中,两个数列的长度是变化关系是:B从1逐次增加1,而C的长度是逐次减少1,直到B的长度和A一样长,C的长度为0.

从上面对插入排序的描述来看,插入排序是一个稳定的排序,也就是说原始元素排好序后,等值元素的位置次序关系不会变,之前靠前的,排好序后还是在前面。

那具体来说,插入排序,就基本的实现思路是什么呢?下面总结一下待排序数组A进行升序排序的实现步骤:

1.将A中的第1个元素划分到数列B中;

2.取A余下的元素归入C中,取C中首个元素赋值给一个临时变量temp;

3.将temp与B中的元素进行反向比较大小,若temp小于B中当前的值,则将B中的元素向右移动,继续逆向取B中的下一个元素;

4.若temp大于B中的当前值,则将temp值插入到B中当前位置的右边;

5.循环执行2-4的步骤,直到C中的元素全部移动到B中;

基于上述的实现步骤,下面,就用java代码,实现插入排序:

/**
* @author "shihuc"
* @date 2017年3月28日
*/
package InsertionSort; import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner; /**
* @author "shihuc"
*
*/
public class Solution { /**
* @param args
*/
public static void main(String[] args) {
File file = new File("./src/insertionSort/sample.txt");
Scanner sc = null;
try {
sc = new Scanner(file);
int N = sc.nextInt();
for(int i=; i<N; i++){
int S = sc.nextInt();
int A[] = new int[S];
for(int j=; j<S; j++){
A[j] = sc.nextInt();
}
insertionSort(A);
print(A, i, "....");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if(sc != null){
sc.close();
}
}
} /**
* 用来打印输出堆中的数据内容。
*
* @param A 堆对应的数组
* @param idx 当前是第几组待测试的数据
* @param info 打印中输出的特殊信息
*/
private static void print(int A[], int idx, String info){
System.out.println(String.format("No. %02d %s ====================== ", idx, info));
for(int i=; i<A.length; i++){
System.out.print(A[i] + ", ");
}
System.out.println();
} /**
* 直接插入法进行插入排序,升序
*
* @param src 待排序的数组
*/
private static void insertionSort(int src[]) { int temp;
int j;
/*
* 实现步骤(5)
*
* for循环i从1开始取值,暗含数组下标0的元素被划出来了。对应实现步骤(1)
*/
for(int i=; i<src.length; i++){
/*
* 实现步骤(2)
*/
temp = src[i];
j = i - ;
/*
* 实现步骤(3)
*/
while(j > && src[j] > temp){ src[j+] = src[j];
j--;
}
/*
* 实现步骤(4)
*/
src[j+1] =
temp; #注意,这里不是src[j] = temp;
}
} }

测试样例数据,即sampe.txt里面的内容:


下面附上测试运行的输出:

No.  .... ======================
, , , , , , ,
No. .... ======================
, , , , , , , , , ,
No. .... ======================
, , , , , , , , , , ,
No. .... ======================
, , , , , , ,
No. .... ======================
, , , , , , , , ,

插入排序的动态过程如下(网上找的一个图,辅助理解算法过程):

从上面的实现过程来看,存在数据移位的操作,双重循环,导致算法复杂度为O(n^2),所以,插入排序针对少量的数据排序,是可以的,性能也不是那么要紧,但是数据量比较大时,就不太合适了。

当然,上面的实现过程,是插入排序的基本实现,有其他变种的插入排序,比如折半插入排序,又叫做二分插入排序,主要是对已排好序的数列B做文章,将查找temp元素插入位置j的过程优化了下,不再对B逆序逐个比较,而是从B中的中间元素开始比较,大于中间元素的话,则再和B右边半数数据中的中间数值比较,以此类推,找到插入点。代码就不做实现了,也不难!

另外,还有一种变种的插入排序,叫希尔排序,这个相对有点特殊,单独作为一篇博文介绍吧。

排序算法<No.6>【插入排序】的更多相关文章

  1. Java常见排序算法之折半插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. Java常见排序算法之直接插入排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  3. 排序算法之直接插入排序Java实现

    排序算法之直接插入排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序: ...

  4. 七内部排序算法汇总(插入排序、Shell排序、冒泡排序、请选择类别、、高速分拣合并排序、堆排序)

    写在前面: 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的随意序列,又一次排列成一个按keyword有序的序列.因此排序掌握各种排序算法很重要. 对以下介绍的各个排序,我们假定全部排 ...

  5. 结构-行为-样式-Js排序算法之 直接插入排序

    最新因工作原因需要接触到算法,之前学习C++的时候有接触过算法,Javascript中实现算法其实也是大同小异.下面我讲下第一个实现的排序算法--直接插入排序.基本实现思路:假定一个数组中前n(n&g ...

  6. 排序算法之折半插入排序的思想以及Java实现

    1 基本思想 折半插入排序(binary insertion sort)的基本原理与直接插入排序相同,不同之处在于,确定当前记录在前面有序子数组中的位置时,直接插入排序是采用顺序查找的方法,而折半插入 ...

  7. 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  8. 我的Java开发学习之旅------>Java经典排序算法之二分插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...

  9. 八大排序算法之直接插入排序(InsertionSort)

    常见的排序算法 今天复习[直接插入排序] 核心思想:有序数组中 找位置 -- 给无序数组第一个 找位置 ` public class InsertionSort { // 核心思想:有序数组中 找位置 ...

  10. 排序算法系列:插入排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)

    在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 和选择排序类似的是也分成“已排序”部分,和“未排 ...

随机推荐

  1. HDU6043 17多校1 KazaQ's Socks 水题

    题目传送:http://acm.hdu.edu.cn/showproblem.php?pid=6043 Problem Description KazaQ wears socks everyday. ...

  2. 在Microsoft Power BI中创建地图的10种方法

    今天,我们来简单聊一聊“地图”. 在我们日常生活中,地图地位已经提升的越来越高,出门聚餐.驾驶.坐车.旅行......应运而生的就是各种Map APP. 作为数据分析师,我们今天不讲生活地图,要跟大家 ...

  3. Eclipse 通过JPA自动生成注解实体

    hibernate是JPA最常用的实现之一,而且hiberante自身也对注释语法进行了支持.现在再不用去看那一堆堆的XML映射了.而且eclipse还提供了从数据库直接生成Entity Class的 ...

  4. Linux按照时间顺序列出文件

    按照递增时间顺序列出所有文件 ls -ltr -l表示列出长串数据,-t表示按照时间顺序,-r表示将排序的结果反向输出 按照时间递减的顺序列出所有文件 ls -lt

  5. 2017-2018-1 20155219《信息安全技术》实验二——Windows口令破解

    2017-2018-1 20155320<信息安全技术>实验二--Windows口令破解 实验目的 了解Windows口令破解原理 对信息安全有直观感性认识 能够运用工具实现口令破解 实验 ...

  6. 数据结构HUFFman求权值

    #include <bits/stdc++.h>using namespace std;priority_queue< int, vector <int>, greate ...

  7. python day 09 文件操作

    一 初识文件操作 使⽤用python来读写⽂文件是非常简单的操作. 我们使⽤用open()函数来打开⼀一个⽂文件, 获取到⽂文件句句柄. 然后通过⽂文件句句柄就可以进⾏行行各种各样的操作了了. 根据打 ...

  8. python性能分析——insert()

    我们在list中插入数据时,经常使用这两个函数: append():在列表的末尾增加一个数据 insert():在某个特定位置前加一个数据 Python内的list实现是通过数组实现的,而不是链表的形 ...

  9. 实验吧—Web——WP之 Forms

    我们先打开解题链接: 做Web题的第一步就是查看网页源代码,当然,有些网页他不会让你点击右键,那么可以在地址栏里的地址前面加上:view-source: 当然也可以打开控制台F12 我们可以看到代码里 ...

  10. poj 2155 B - Matrix 二维树状数组

    #include<iostream> #include<string> #include<string.h> #include<cstdio> usin ...