8种经典排序之直接插入排序
2015-07-30 16:17
183 查看
直接插入排序是稳定的排序方法。
基本思想:
假设待排序的记录存放在数组array[1..n]中,将第一个数取出来,自己array[1]作为一个有序序列,无序序列即array[2..n]。从n=2 至 n = n为止,依次将array
插入到有序序列当中,使插入的记录也是有序的,生成含n个记录的有序序列。
具体操作:
将要插入的记录array[i]取出,保存到临时变量temp中;
找到array[ i ] (i=2,3….,n-1)的正确插入位置k (1≤ k ≤ n-1 );
将temp与array[i-1]进行比较,若temp大,则将array[i-1]向后移,直到找到比temp小的记录,将temp插入到该记录的后一位置。
如此循环n-1次,直到把这n-1个记录全部插入有序序列。
图解:
代码实现:
结果实例:
直接插入排序
1 2 3 4 5 6 7 8 9 10
我也有看过 带哨兵的直接插入排序,不是很理解,回头再去看看,大家要是有什么好的,分享一起学习学习,共同进步。
基本思想:
假设待排序的记录存放在数组array[1..n]中,将第一个数取出来,自己array[1]作为一个有序序列,无序序列即array[2..n]。从n=2 至 n = n为止,依次将array
插入到有序序列当中,使插入的记录也是有序的,生成含n个记录的有序序列。
具体操作:
将要插入的记录array[i]取出,保存到临时变量temp中;
找到array[ i ] (i=2,3….,n-1)的正确插入位置k (1≤ k ≤ n-1 );
将temp与array[i-1]进行比较,若temp大,则将array[i-1]向后移,直到找到比temp小的记录,将temp插入到该记录的后一位置。
如此循环n-1次,直到把这n-1个记录全部插入有序序列。
图解:
代码实现:
#include <iostream> using namespace std; void insert_sort(int a[] , int len) { int i , j , temp; for (i = 1; i < len; i++) { //暂时保存需要插入的那个数,因为在比较时会把a[i]的值覆盖,所以需要先保存 temp = a[i]; for (j = i - 1; j >= 0 && a[j] > temp; j--) { //如果满足条件,则将a[j]向后移动 a[j+1] = a[j]; } //将这个数插入有效序列 a[j+1] = temp; } } void print_sort(int a[] , int len) { for (int i = 0; i < len ; i++) { cout<<a[i]<<" "; } cout<<endl; } int main(int argc, const char * argv[]) { int a[] = {1 , 3 , 7 , 2 , 5 , 9 , 8 ,6 , 4 , 10}; cout<<"直接插入排序"<<endl; insert_sort(a, 10); print_sort(a, 10); return 0; }
结果实例:
直接插入排序
1 2 3 4 5 6 7 8 9 10
我也有看过 带哨兵的直接插入排序,不是很理解,回头再去看看,大家要是有什么好的,分享一起学习学习,共同进步。
相关文章推荐
- 谈谈我的出差感想
- 微信支付现金红包接口(转)
- AIX 未开启AIO引起SQLPLUS登陆报错exec(): 0509-036
- gdb调试命令
- 黑马程序员--应用:用指针变量作为函数的参数,求出10个数的最大值
- 笔记一把,JS闭包的典型实例
- springMVC开发之一DispatcherServlet(转)
- 打印数学函数值表的程序
- ubuntu 14.04 降内核版本 -- 原因是 perf 版本与内核版本不配套
- highcharts如何在一个图表中使多条曲线在不同刻度下显示
- Java内存泄露的理解与解决
- 从Wordpress转五指CMS
- jsp与mysql中的中文字符乱码问题
- 两种高性能I/O设计模式(Reactor/Proactor)的比较
- 自己收集的比较好的博客或网站
- 九度oj 1443
- 利用java实现单词倒序排列
- 搞个这样的APP要多久?
- block中用到self要特别注意内存泄露问题
- NGINX + TOMCAT + MEMCACHED实现HTTP负载均衡