插入排序思想及其实现
来源:互联网 发布:七分网络查分 编辑:程序博客网 时间:2024/06/05 07:41
1. 基本思想:
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
2. 排序过程:
【示例】:
[初始关键字] [49] 38 65 97 76 13 27 49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
第一轮:10,9,8,7,6,5,4->9,10,8,7,6,5,4(交换1次)(循环1次)
第二轮:9,10,8,7,6,5,4->8,9,10,7,6,5,4(交换1次)(循环2次)
第三轮:8,9,10,7,6,5,4->7,8,9,10,6,5,4(交换1次)(循环3次)
第四轮:7,8,9,10,6,5,4->6,7,8,9,10,5,4(交换1次)(循环4次)
第五轮:6,7,8,9,10,5,4->5,6,7,8,9,10,4(交换1次)(循环5次)
第六轮:5,6,7,8,9,10,4->4,5,6,7,8,9,10(交换1次)(循环6次)
循环次数:6次
交换次数:6次
从上面的结果可以看出,循环的次数f(n)<= 1/2*n*(n-1)<=1/2*n*n。所以其复杂度仍为O(n*n)(这里说明一下,
其实如果不是为了展示这些简单排序的不同,交换次数仍然可以这样推导)。现在看交换,从外观上看,交换次数是O(n)(推导类似
选择法),但我们每次要进行与内层循环相同次数的‘=’操作。正常的一次交换我们需要三次‘=’
而这里显然多了一些,所以我们浪费了时间。
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。
2. 排序过程:
【示例】:
[初始关键字] [49] 38 65 97 76 13 27 49
J=2(38) [38 49] 65 97 76 13 27 49
J=3(65) [38 49 65] 97 76 13 27 49
J=4(97) [38 49 65 97] 76 13 27 49
J=5(76) [38 49 65 76 97] 13 27 49
J=6(13) [13 38 49 65 76 97] 27 49
J=7(27) [13 27 38 49 65 76 97] 49
J=8(49) [13 27 38 49 49 65 76 97]
#include <iostream>using namespace std; void insert_sort(int* pData,int count) { int iTemp; int iPos; for(int i=1;i<count;i++) { iTemp = pData[i]; iPos = i-1; while((iPos>=0) && (iTemp<pData[iPos])) { pData[iPos+1] = pData[iPos]; iPos--; } pData[iPos+1] = iTemp; } } void main() { int data[] = {10,9,8,7,6,5,4}; insert_sort(data,7); for (int i=0;i<7;i ) cout<<data<<" "; cout<<"\n"; }倒序(最糟情况)
第一轮:10,9,8,7,6,5,4->9,10,8,7,6,5,4(交换1次)(循环1次)
第二轮:9,10,8,7,6,5,4->8,9,10,7,6,5,4(交换1次)(循环2次)
第三轮:8,9,10,7,6,5,4->7,8,9,10,6,5,4(交换1次)(循环3次)
第四轮:7,8,9,10,6,5,4->6,7,8,9,10,5,4(交换1次)(循环4次)
第五轮:6,7,8,9,10,5,4->5,6,7,8,9,10,4(交换1次)(循环5次)
第六轮:5,6,7,8,9,10,4->4,5,6,7,8,9,10(交换1次)(循环6次)
循环次数:6次
交换次数:6次
从上面的结果可以看出,循环的次数f(n)<= 1/2*n*(n-1)<=1/2*n*n。所以其复杂度仍为O(n*n)(这里说明一下,
其实如果不是为了展示这些简单排序的不同,交换次数仍然可以这样推导)。现在看交换,从外观上看,交换次数是O(n)(推导类似
选择法),但我们每次要进行与内层循环相同次数的‘=’操作。正常的一次交换我们需要三次‘=’
而这里显然多了一些,所以我们浪费了时间。
0 0
- 插入排序思想及其实现
- 插入排序思想与实现
- 排序--计数排序思想及其代码实现
- 排序--归并算法思想及其代码实现
- 快速排序思想及其算法实现
- 选择排序的思想及其实现
- 队列优先 之 插入排序实现(插入思想)
- 直接插入排序及其JAVA实现
- 三种插入排序及其C++实现
- 排序--冒泡排序的基本思想及其代码实现
- 排序--快速排序算法的思想及其代码实现
- 排序--简单选择排序思想及其代码实现
- 排序--堆排序的基本思想及其代码实现
- 排序--直接插入排序思想及代码实现
- java冒泡排序、选择排序、插入排序算法的核心思想及其比较
- 快速排序的基本思想及其java的实现
- 冒泡排序思想解析及其实现(java)(1)
- 冒泡排序思想解析及其实现(java)(2)
- [Leetcode] Letter Combinations of a Phone Number (Java)
- tdb---数据库
- SuperSpider——打造功能强大的爬虫利器
- 基于BOLT的仿迅雷加速器界面开发(一)
- linux编译出现undefined reference to `pow‘的错误
- 插入排序思想及其实现
- Android源代码仓库及其管理工具Repo分析
- ZOJ 3229 Shoot the Bullet 有源汇最大流(好题)
- 计算机操作系统——进程管理(1)
- 贪心算法思想及实现
- 索爱X10i小技巧,X10i的三种模式(新手扫盲)
- 短视频的那些事
- 被大家忽略的从代码到可执行文件中间的过程
- fedora创建快捷键打开终端(terminal)