【算法】--插入排序
2015-07-28 17:23
204 查看
起篇---插入排序
简介:这个算法很简单,故此不做多述。
一、插入排序定义
顾名思义,插入排序,就是把后读取到的数字插入到已经排好序的序列中。如同现实中的扑克游戏,每次新抓一张牌,扫一眼手中排好序的牌,把这张新抓的牌插入到对应的位置。
二、插入排序示例
现在假设我们有一组数组: A[10] = {2, 1, 3, 9, 8, 6, 7, 4, 12, 10}。假设A[0],A[1]....A[9]分别对应10张写着对应数字的扑克牌,并扣至在桌子上。我们手中没牌。要求按照从小到大的顺序排列。
现在抓到第0张牌,哦,写的是2,对应在A[0]的位置。再抓第1张牌,哦,写着是1,对应在A[1]的位置。此时我们发现A[0]和A[1]大小颠倒,所以需要交换A[0],A[1]的位置。我们定义一个变量Key,令Key=A[1](就是我们刚抓的这张新牌)。这样A[1] = A[0]; A[0] = Key 我们就实现了A[0]
A[1]的对换。此时相当于我们排好了手中的牌。接下来我们再抓第2张牌,发现是3,对应在A[2]的位置,同样使用Key=A[2]再比较A[0] A[1]之后发现这张牌最大,所以我们不需要进行重排,直接放在A[2]的位置不变。依次类推,在抓到第4张牌,即A[4] = 8的时候,我们发现8 比上一张牌 9小(要谨记,手中的牌已经排好序,即手中的最后一张牌是最大的),所以我们依然通过Key = A[4] == 8实现A[3] A[4]位置调换。由于Key = 8比A[2] = 3大,所以不再进行位置调换。接着抓下一张牌.......直到结束。
这样插入排序的思路大致清晰了。下面直接上代码。(注意上文中我使用了位置调换这个词,其实代码中不需要每次移动位置都进行这个操作。因为新抓的牌已经放到Key里了,所以只需把A[i]的位置向后移动一位,覆盖掉后面的A[i+1],最后不再移动A[i]的时候再把Key放到它应该放的位置)。
输出结果:
简介:这个算法很简单,故此不做多述。
一、插入排序定义
顾名思义,插入排序,就是把后读取到的数字插入到已经排好序的序列中。如同现实中的扑克游戏,每次新抓一张牌,扫一眼手中排好序的牌,把这张新抓的牌插入到对应的位置。
二、插入排序示例
现在假设我们有一组数组: A[10] = {2, 1, 3, 9, 8, 6, 7, 4, 12, 10}。假设A[0],A[1]....A[9]分别对应10张写着对应数字的扑克牌,并扣至在桌子上。我们手中没牌。要求按照从小到大的顺序排列。
现在抓到第0张牌,哦,写的是2,对应在A[0]的位置。再抓第1张牌,哦,写着是1,对应在A[1]的位置。此时我们发现A[0]和A[1]大小颠倒,所以需要交换A[0],A[1]的位置。我们定义一个变量Key,令Key=A[1](就是我们刚抓的这张新牌)。这样A[1] = A[0]; A[0] = Key 我们就实现了A[0]
A[1]的对换。此时相当于我们排好了手中的牌。接下来我们再抓第2张牌,发现是3,对应在A[2]的位置,同样使用Key=A[2]再比较A[0] A[1]之后发现这张牌最大,所以我们不需要进行重排,直接放在A[2]的位置不变。依次类推,在抓到第4张牌,即A[4] = 8的时候,我们发现8 比上一张牌 9小(要谨记,手中的牌已经排好序,即手中的最后一张牌是最大的),所以我们依然通过Key = A[4] == 8实现A[3] A[4]位置调换。由于Key = 8比A[2] = 3大,所以不再进行位置调换。接着抓下一张牌.......直到结束。
这样插入排序的思路大致清晰了。下面直接上代码。(注意上文中我使用了位置调换这个词,其实代码中不需要每次移动位置都进行这个操作。因为新抓的牌已经放到Key里了,所以只需把A[i]的位置向后移动一位,覆盖掉后面的A[i+1],最后不再移动A[i]的时候再把Key放到它应该放的位置)。
#include <stdio.h> int insertSort(int arr[], int n) { int key; int i, j; for(j = 1; j < n; j++) { key = arr[j]; i = j - 1; while(i >= 0 && arr[i] > key) { arr[i + 1] = arr[i]; i--; } arr[i + 1] = key; } return 0; } int main(void) { int arr[] = {1, 6, 5, 3, 2, 9, 32, 12, 14, 26, 16, 17, 10, 11, 13}; printf("The origional sequence is: \n"); int n = sizeof(arr)/sizeof(arr[0]); for(int i = 0; i < n; i++) printf("%d ",arr[i]); printf("\n\n After sourted, the sequence is:\n"); insertSort(arr, n); for(i = 0; i < n; i++) printf("%d ",arr[i]); printf("\n"); }
输出结果:
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- HDU 3746
- iOS—修改AFNetworking源文件可接收text/plain的方法
- uva 10006 10006 - Carmichael Numbers
- 树莓派 raspberry安全关机命令重启命令
- 转如何在oracle中导入dmp数据库文件
- BlockingQueue
- IOS-写文件到本地
- Activity的启动模式与flag详解
- 【原】如何阅读学术论文
- 【MySQL笔记】mysql来源安装/配置步骤和支持中国gbk/gb2312编码配置
- 总线接口与计算机通信(三)UART起止式异步通用串行数据总线
- Android中按钮的水波纹点击效果的实现
- 回顾:中网饱经沧桑劫后余生 万平国回首艰辛历程
- GIT使用指南
- Ubuntu 下 su:authentication failure的解决办法
- C#虚方法和抽象方法 .
- JAVA动态加载类和静态加载类
- 使用JavaScript修改浏览器URL地址栏的实现代码
- hdoj,愚人节的礼物