[算法] 插入排序 Insertion Sort
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找插入排序。
从数据第二个元素开始遍历
0 1 2 3 4 5 20 30 10 60 50
20 40 10 60 50
20 30 40 60 50
10 20 30 40 50
10 20 30 40 50 i=1; temp=a[1]=40; j=i-1=0; a[0]>40,若前面的元素比当前元素大。 i=2; temp=a[2]=30, j=i-1=1;a[1]>30 成立,a[2]=a[1], 让a[1]往后移动一位.j- - 继续前移,再比较,j=0,a[0]>30,否,退出循环。a[1]=30. I=3; temp=a[3]==10, j=i-1=2; a[2]>10 ? 成立,a[3]=a[2],让a[2]往后移动一位到a[3]的位置.
j- - ; j = 1 ; a[1]>10 ? 成立,a[2]=a[1],让a[1] 往后移动一位到a[2]的位置。
j- - ; j=0 ; a[0]>10? 成立,a[1]=a[0],让a[0]往后移动一位到a[1]的位置。
j- - ;j=-1; 跳出循环,a[-1+1] =a[0] = 10 ;插入当前值。 I=4,temp=a[4]=60,j=i-1=3,a[3]>a[4]? 不成立,跳出循环
a[j+1] =a[i] =60 i=5,temp=a[5]=50, j=i-1=4,判断a[4]>50 ,成立,a[5]=a[4]
j- - ; j =3 ; a[3]>50成立? 不成立,跳出循环。
J[4]= 50 ;插入当前值。
使用插入排序为一列数字进行排序的过程

Java代码示例:
package com.sort;
public class InsertSort {
/*
* 直接插入排序
*
* 参数说明: a -- 待排序的数组 n -- 数组的长度
*/
public static void insertSort(int[] a, int n) {
int length = a.length; // 数组长度
int i; // 当前值的位置
int j; // 指向j前的位置
int temp; // 当前要进行插入排序的值
// 从数组的第二个位置开始遍历值
for (i = 1; i < length; i++) {
temp = a[i];
j = i - 1;
// a[j]比当前值大时,a[j]后移一位,空出j的位置,好让下一次循环的值后移
while (j >= 0 && a[j] > temp) {
a[j + 1] = a[j]; // 将a[j]值后移
j--; // j前移
}
// 跳出循环(找到要插入的中间位置或已遍历到0下标)
a[j + 1] = temp; // 将当前值插入
}
}
public static void main(String[] args) {
int i;
int[] a = { 20, 40, 30, 10, 60, 50 };
System.out.printf("before sort:");
for (i = 0; i < a.length; i++)
System.out.printf("%d ", a[i]);
System.out.printf("\n");
insertSort(a, a.length);
System.out.printf("after sort:");
for (i = 0; i < a.length; i++)
System.out.printf("%d ", a[i]);
System.out.printf("\n");
}
}
[算法] 插入排序 Insertion Sort的更多相关文章
- 经典排序算法 – 插入排序Insertion sort
经典排序算法 – 插入排序Insertion sort 插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕. 插入排序方法分直接插入排序和折半插入排序两种, ...
- 排序算法--插入排序(Insertion Sort)_C#程序实现
排序算法--插入排序(Insertion Sort)_C#程序实现 排序(Sort)是计算机程序设计中的一种重要操作,也是日常生活中经常遇到的问题.例如,字典中的单词是以字母的顺序排列,否则,使用起来 ...
- 排序算法 - 插入排序(Insertion sort)
插入排序对于少量元素的排序是很高效的,而且这个排序的手法在每个人生活中也是有的哦. 你可能没有意识到,当你打牌的时候,就是用的插入排序. 概念 从桌上的牌堆摸牌,牌堆内是杂乱无序的,但是我们摸上牌的时 ...
- 跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort)
跳跃空间(链表)排序 选择排序(selection sort),插入排序(insertion sort) 选择排序(selection sort) 算法原理:有一筐苹果,先挑出最大的一个放在最后,然后 ...
- [Swift]LeetCode147. 对链表进行插入排序 | Insertion Sort List
Sort a linked list using insertion sort. A graphical example of insertion sort. The partial sorted l ...
- 排序算法一:插入排序(Insertion sort)
最近从网易公开课在看麻省理工学院的公开课<算法导论>,感觉还不错,接下来几篇文章所示学习日记了,不准备对算法细节做过多描述,感兴趣的可以自己去看. 文章分几篇讲经典排序算法,直接上代码,根 ...
- 基础算法之插入排序Insertion Sort
原理 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元 ...
- 【数据结构】算法 LinkList (Insertion Sort List 链表插入排序)
将一个单链表进行处理后,所得结果为一有序链表 Solution: 将原始链表逐个查询,插入新链表,在插入的同时对链表进行排序.时间复杂度O(n*n) public ListNode insertion ...
- 插入排序 Insertion Sort
插入排序算法的运作如下: 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 插入排序算法的实现我放在这里. 时间/空间复杂度: 最差时间复杂度 O(n^2) 最优时间 ...
随机推荐
- 内存单元按字节编址,地址0000A000H~0000BFFFH共有几个存储单元
一般可以这样:按十六进制(bffff-a000)+1=1fff+12000H=2x16x16x16=81928192/1024=8 最后是8k或者按二进制bfff-a000=0001 1111 111 ...
- Tornado 中的 get() 或 post() 方法
---恢复内容开始--- Tornado 中的 get() 或 post() 方法 请求处理程序和请求参数 Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornado.we ...
- Atheros AR9485 ubuntu 10.04 驱动安装及networking disable问题解决
Laptop: ACER Aspire 5733-6629 Wireless:Lite-on HB125, CHIPS: Atheros AR9485 Ubuntu: 10.04LTS (2.6.32 ...
- Interpolated Strings
https://msdn.microsoft.com/en-us/library/dn961160.aspx ; // Before C# 6.0 System.Console.WriteLine(S ...
- CentOS5.5 正式开始安装 Oracle 11g r2(图形界面安装)
一.下载oracle 官方网站, 可以下载最新版本 Oracle Database 11g Release http://www.oracle.com/index.html CentOS5. i386 ...
- hdu 4939 Stupid Tower Defense ( dp )
题目链接 题意:给出一条长为n个单位长度的直线,每通过一个单位长度需要t秒. 有3种塔,红塔可以在当前格子每秒造成x点伤害,绿塔可以在之后的格子每秒造成y点伤害, 蓝塔可以使通过单位长度的时间增加z秒 ...
- js自动判断浏览器类型跳转到手机版
//电脑版头部写法:<script language="javascript"> function is_mobile() { var regex_match = /( ...
- 漫谈 polling 和 Websocket
Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...
- Android listView如何判断数据多屏显示 (2012-03-06 09:47:04)
@Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int tot ...
- 【Mysql】安装 mysql-5.7.5 指南
因为同学需要安装mysql,安装过程,一路百度,在这里记录一下步奏.以后还会用到. 1.mysql-5.7.5-m15-winx64.zip下载 官方网站下载地址:http://cdn.mysql.c ...