【数据结构】:排序--插入排序
来源:互联网 发布:查看linux文件编码格式 编辑:程序博客网 时间:2024/06/06 22:41
插入排序:
- 基本思想:
可以这样理解:将无序的区间插入到有序的区间里 - 分类:
1)直接插入排序
2)希尔排序
3)折半插入排序
1、直接插入排序:
- 基本思想:
将第i个记录插入到第i-1个序列中,将第i个数对应的关键字k与第i-1前面排好序的数进行比较,(我们这里以降序为例)如果k是比前面的数都小的,那么直接进行插入,否则在第i-1个数中进行寻找合适的位置,找到之后再进行插入。 - 图示:
- 代码实现:
void Sort(int* a,int n){ int i = 0; for(i = 1; i<n; i++) { int temp = a[i]; int end = i-1; while(end >= 0) { if(a[end] < temp) { a[end+1] = a[end]; end--; } else { break; } } a[end+1] = temp; }}
- 时间复杂度
1)最坏的情况(逆序):O(N)
2)最好的情况(正序):O(N^2) - 空间复杂度
O(1) - 直接插入排序的稳定性:
1)是稳定的排序方法
2)它的优缺点:它的排序效率算是比较高的一种排序方法,但是当数据不断增多的时候,它的劣势也就增加了
2、折半插入排序:
基本思想:
我们知道在直接插入排序中被插入的区间是已经有序的,所以当我们在进行插入的时候,不用挨个进行比较,采用折半的方法来进行比较,这样效率就提高了代码实现:
for(int i = 1; i<n; i++) { int low = 0; int key = a[i]; int high = i-1; while(low <= high) { int mid = low-((high-low)>>1); if(a[mid] > key) high = mid-1; else left = mid+1; } int end = i-1; while(end >= 0) { if(a[end] > key) { a[end+1] = a[end]; end--; } else { break; } } a[end+1] = temp;}
3、希尔排序:
- 基本思想:
我们知道在进行直接插入排序的时候如果遇到了逆序的情况,此时效率会很低,希尔这个人他就在想,如果是这样的情况,有没有一种方式,在进行直接插入排序的之前,将要排序的数变成接近有序。因此就出现了现在的另一种排序方法:希尔排序,其实它也是对直接插入排序的一种优化。 - 图示说明:
- 代码实现:
void Sort(int* a, int n){ int i = 0; int gap = n; int end = 0; while(gap>1) { gap = gap/3+1; for(i = gap; i<n; i++) { int temp = a[i]; end = i-gap; while(end >= 0) { if(a[end] < temp) { a[end + gap] = a[end]; end -= gap; } else { break; } } a[end+gap] = temp; } }}
- 时间复杂度和空间复杂度
1)时间复杂度
它的时间复杂度不是很容易计算的:
大体的时间复杂度就是:O(N)< O(希尔)
0 0
- 数据结构 排序 插入排序
- 【数据结构】:排序--插入排序
- 数据结构-排序: 折半插入排序
- 数据结构 排序2 插入排序
- 《数据结构--排序》之插入排序
- 数据结构--排序之插入排序
- 数据结构排序之插入排序
- 数据结构排序之插入排序
- 数据结构-插入排序-希尔排序
- 数据结构-插入排序&希尔排序
- 插入排序 --C数据结构
- {数据结构}直接插入排序
- 数据结构--直接插入排序
- 数据结构之 插入排序
- 数据结构-插入类型排序
- 【数据结构】直接插入排序
- 数据结构-插入排序算法
- 数据结构_插入排序
- Android 通用流行框架
- TextView的字数行数限制显示
- java中volatile、synchronized关键字的含义
- php的垃圾回收机制
- 一个简单的方法解决Android Studio打开旧项目、其他项目各种报错问题
- 【数据结构】:排序--插入排序
- Virtualbox中的Ubuntu虚拟机,安装增强功能时出错:未能加载
- Java加在非静态函数和静态函数(static)中用File类读取resources在的文件
- html 文本输入框效果
- matlab 高性能并行计算之 spmd
- ECMAScript 6 细读
- iOS10新特性之SFSpeechRecognizer的使用
- 开发者账号总结
- C#与日期有关的字符串格式化方法