基础算法之四--排序: 之插入排序
来源:互联网 发布:简单网页源码 编辑:程序博客网 时间:2024/05/16 01:36
冒泡排序两两比较指的是: 未排序的相邻元素之间的两两比较,对于已排好的元素,它不再访问。
而插入排序中的比较则是: 在未排序的元素中,取出一个,将它与已排好的元素进行比较,从而确定其位置。
是某未排元素,与诸多已排元素的逐次比较。
其排序图解如下:
程序代码:
1) 比较一次 , 移动一次
//比较一次,移动一次void StraightInsertionSort(int *p,int n){int i,j,t;for (i=1;i<n;i++) // 0...i-1 是已排好元素 i...n-1是未排元素{t=p[i]; // 记录下 将要与排好序的元素 进行比较的那个 未排序元素for (j=i-1;j>=0;j--){if (t<p[j]) // 比较一次, 移动一次{p[j+1]=p[j];p[j]=t;}else{break; // 已经将t 存放到目标位置}}}}
2) 先找到合适位置,再集体移动
// 先找位置 再集体移动void StraightInsertionSort(int *p,int n){int i,j,t;for (i=1;i<n;i++) // 0...i-1 是已排好元素 i...n-1是未排元素{t=p[i]; // 记录下 将要与排好序的元素 进行比较的那个 未排序元素// 找t所应在的位置for (j=i-1;j>=0;j--){if (t>=p[j]) // 说明t应该放在j+1 位置上break;}for (int k=i-1;k>j;k--){p[k+1]=p[k];}p[j+1]=t;}}
3) 对于情况2,可以用二分查找法优化程序, 如下:
void BinaryInsertionSort(int *p, int n){int i,j,k;for (i=1;i<n;i++) // 0...i-1 是已排好元素 i...n-1是未排元素{int t=p[i]; // 记录下 将要与排好序的元素 进行比较的那个 未排序元素int iLeft=0;int iRight=i-1;int iMiddle=(iLeft+iRight)/2;while (iLeft<=iRight){if (t>p[iMiddle]){iLeft=iMiddle+1;}if (t<p[iMiddle]){iRight=iMiddle-1;}if (t==p[iMiddle]){j=iMiddle; // 0....j 不需移动 j+1...i-1 需要后移一位 t 应保存在第j+1位置break;}iMiddle=(iLeft+iRight)/2;}if (iLeft>iRight){j=iLeft-1; // 0....j 不需移动 j+1...i-1 需要后移一位 t应保存在第j+1位置} for (k=i-1;k>j;k--){p[k+1]=p[k];}p[j+1]=t;}}
- 基础算法之四--排序: 之插入排序
- 基础算法之插入排序
- 算法基础之插入排序
- 算法基础之排序篇-插入排序
- 基础算法--排序: 之插入排序
- 基础算法之排序(3)--插入排序
- 算法基础之排序—插入排序
- C++基础笔记之四:插入排序
- 排序四之插入排序
- 【基础算法】排序-简单排序之三(插入排序)
- 基础算法之四--排序:之基数排序
- 算法(algorithms)基础之:插入排序
- 算法基础之----直接插入排序
- 基础算法系列(七)排序算法之插入排序
- 排序算法之插入排序
- 排序算法之插入排序
- 排序算法之插入排序
- 排序算法之插入排序
- 20120221雨
- 硬件防火墙的开发过程
- 输出摆幅是指
- ubuntu 最简单的rvm ruby rails 安装命令
- linux下的C语言编程(总结篇)
- 基础算法之四--排序: 之插入排序
- RouteData
- 程序员的生存法则
- 去处字符串两边的空格
- spring使用annonation管理hibernate的事物
- linux 下time命令
- 查找Windows内存泄露的工具与技术介绍
- csdn几个网站
- Android ImageSwitcher和Gallery 综合使用