插入排序
2016-01-18 21:46
387 查看
插入排序的主要思想是将一个待排序的一组数按照其关键码的大小插入到已经排好序的有序序列中,直到所有待排元素插入对应的序列中。下面给出维基百科上插入排序的定义:(https://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F)
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。下面用一个GIF图形象的展示该过程:
下面主要介绍直接插入排序和希尔排序。
直接插入排序
直接插入排序是最简单的插入排序,往往实现该算法都是借助数组,思路就是扫描数组,把元素插入到有序的序列中。下面通过简单的给出代码:
希尔排序(Shell Sort)是对直接插入排序的一种改进,主要思想就是把待排序的序列分割成若干个子序列,在子序列中分别进行直接插入排序,待整个序列基本有序时,再对全体元素进行一次直接插入排序。
给出该过程的代码:
文章只是简单的介绍实现算法过程,由于本人水平有限,没有详细的分析上面两种种算法的O(f(n))。
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。下面用一个GIF图形象的展示该过程:
下面主要介绍直接插入排序和希尔排序。
直接插入排序
直接插入排序是最简单的插入排序,往往实现该算法都是借助数组,思路就是扫描数组,把元素插入到有序的序列中。下面通过简单的给出代码:
#include<iostream> using namespace std; void straightSort(int *, int); int j; //j是全局变量 void straightSort(int *arry, int length) { int flag; for (int i = 0; i<length; i++) { flag = arry[i]; for (j = i - 1; j >= 0 && arry[j]>flag; j--) { arry[j + 1] = arry[j]; } arry[j + 1] = flag;//由于第二个for循环j自身减一退出循环,该处j需要自身加一 } } int main(){ int arry[] = {11,5,2,1,10,4,6,8,7}; int length = sizeof(arry) / sizeof(int); straightSort(arry,length); for (int i = 0; i <length; i++) { cout << arry[i] <<" "; } cout << endl; }希尔排序
希尔排序(Shell Sort)是对直接插入排序的一种改进,主要思想就是把待排序的序列分割成若干个子序列,在子序列中分别进行直接插入排序,待整个序列基本有序时,再对全体元素进行一次直接插入排序。
给出该过程的代码:
#include<iostream> using namespace std; void shellSort(int *, int); void shellSort(int *arry, int length) { { int j, gap; // for (gap = 3; gap > 0; gap--) for (gap = length / 2; gap > 0;gap/=2) for (j = gap; j < length; j++) if (arry[j] < arry[j - gap]) { int temp = arry[j]; int flag = j - gap; while (flag >= 0 && arry[flag] > temp) { arry[flag + gap] = arry[flag]; flag = flag - gap; } arry[flag + gap] = temp; } } } void main() { int arry[] = { 11,5,2,10,4,6,8 }; int length = sizeof(arry) / sizeof(int); shellSort(arry, length); for (int i = 0; i < length; i++) { cout << arry[i] << " "; } }从上面可以看出希尔排序比直接插入排序相对复杂,但是如果排序思路清晰的话,该过程实现起来不是太难。如果感兴趣可以画出图解,比较直观。
文章只是简单的介绍实现算法过程,由于本人水平有限,没有详细的分析上面两种种算法的O(f(n))。
相关文章推荐
- C++开发人脸性别识别教程(13)——针对单张图片的性别识别
- memcache -- 使用场景
- Java基础-FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream实现文件拷贝...
- Java基础-FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream实现文件拷贝
- 同行代码评审过程中的实践经验
- 截屏
- 【BZOJ1468】Tree
- 总是提示下载百度云管家的解决办法
- STL_算法_删除(unique、unique_copy)
- clover 显卡注入功能详细讲解
- layoutinflaterde 使用
- 安卓设置imageview变暗的效果,类似于qq离线状态
- cacti常见问题
- Android 内核之Android与Linux的关系
- Numpy的tile函数
- Spfa 模板
- 瀑布式开发、迭代开发、敏捷开发、XP与SCRUM的区别
- 【BZOJ2152】聪聪可可
- VS2010使用NuGet程序包管理器
- Java基础-实现文件搜索功能