数据结构 - 2-路插入排序 具体解释 及 代码(C++)
2-路插入排序 具体解释 及 代码
本文地址: http://blog.csdn.net/caroline_wendy/article/details/24267679
2-路插入排序的思想非常有意思:
通过一个辅助的循环数组, 假设大于最大的元素, 则插入至尾部, 假设小于最小的元素, 则插入至头部,
假设在两者之间, 採用折半查找的方式,移动一部分的元素;
设计到循环数组的中间值的查找和数据移动的问题.
因为折半查找能够降低比較次数,
首尾插入又不须要移动元素, 即移动次数约为[(n^2)/8], 有1/2的元素不须要移动, 每次移动(1/2*1/2), 所以移动次数为[(n^2)/8];
可是须要n个辅助空间, 时间复杂度扔是O(n^2);
代码例如以下:
/*
* test.cpp
*
* Created on: 2014.04.21
* Author: Spike
*/ /*eclipse cdt, gcc 4.8.1*/ #include <iostream>
#include <deque> void print(const std::deque<int>& L) {
for(auto i: L) {
std::cout << i << " ";
} std::cout << std::endl;
} void insertSort(std::deque<int>& L)
{
int first(0), final(0);
std::size_t n(L.size()); std::deque<int> D(n); D[0] = L[0]; for(std::size_t i=1; i<n; ++i) {
if (L[i] < D[first]) { //小于最小元素
first = (first-1+n)%n;
D[first] = L[i];
print(D);
} else if (L[i] > D[final]) { //大于最大元素
final = (final+1+n)%n;
D[final] = L[i];
print(D);
} else {
//折半查找
int low(0), high((final-first)%n);
int temp(first), end(high);
while (low <= high) {
int m = (low + high)/2;
if (L[i] < D[(m+temp)%n])
high = m-1;
else
low = m+1;
}
for (int j=end; j>=high+1; --j) {
D[(j+temp+1)%n] = D[(j+temp)%n];
}
D[(high+temp+1)%n] = L[i];
final = (final+1+n)%n;
print(D);
}
} //复制数组
for (std::size_t k=0; k<n; k++) {
L[k] = D[(first+k)%n];
}
} int main(void)
{
std::deque<int> L = {9, 3, 2, 4, 5, 8, 7, 6};
print(L);
insertSort(L);
print(L);
return 0;
}
输出:
9 3 2 4 5 8 7 6
9 0 0 0 0 0 0 3
9 0 0 0 0 0 2 3
4 9 0 0 0 0 2 3
4 5 9 0 0 0 2 3
4 5 8 9 0 0 2 3
4 5 7 8 9 0 2 3
4 5 6 7 8 9 2 3
2 3 4 5 6 7 8 9
数据结构 - 2-路插入排序 具体解释 及 代码(C++)的更多相关文章
- 数据结构 - 表插入排序 具体解释 及 代码(C++)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/24323125 表插入排序 具体解释 及 代码 ...
- 数据结构 - 堆排序(heap sort) 具体解释 及 代码(C++)
堆排序(heap sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 堆排序包括两个步骤: 第一步: 是建立大顶堆(从大到小排 ...
- 数据结构 - 归并排序(merging sort) 具体解释 及 代码
归并排序(merging sort) 具体解释 及 代码 本文地址: http://blog.csdn.net/caroline_wendy 归并排序(merging sort): 包括2-路归并排序 ...
- 数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++)
数据结构 - 希尔排序(Shell's Sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2 ...
- 数据结构 - 树形选择排序 (tree selection sort) 具体解释 及 代码(C++)
树形选择排序 (tree selection sort) 具体解释 及 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 算法逻辑: 依据节点的大小, ...
- android widget 开发实例 : 桌面便签程序的实现具体解释和源代码 (上)
如有错漏请不吝拍砖指正,转载请注明出处,很感谢 桌面便签软件是android上经常使用软件的一种,比方比較早的Sticky Note,就曾很流行, Sticky Note的介绍能够參见 http:// ...
- python数据结构之直接插入排序
python数据结构之直接插入排序 #-*-encoding:utf-8-*- ''' 直接插入排序: 从序列的第二个元素开始,依次与前一个元素比较,如果该元素比前一个元素大, 那么交换这两个元素.该 ...
- [4] 算法之路 - 插入排序之Shell间隔与Sedgewick间隔
题目 插入排序法由未排序的后半部前端取出一个值.插入已排序前半部的适当位置.概念简单但速度不快. 排序要加快的基本原则之中的一个: 是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度 ...
- Vue学习之路之登录注册实例代码
Vue学习之路之登录注册实例代码:https://www.jb51.net/article/118003.htm vue项目中路由验证和相应拦截的使用:https://blog.csdn.net/wa ...
随机推荐
- [Go] 第一个单词首字母变大写:Ucfirst(),第一个单词首字母变小写:Lcfirst()
import ( "unicode" ) func Ucfirst(str string) string { for i, v := range str { return stri ...
- C#编程(四十三)----------Lambda表达式
Lambda表达式 案例: using System; using System.Collections.Generic; using System.Linq; using System.Text; ...
- Mysql导入大容量SQL文件数据问题
mysql在通过导入sql文件可能会出现下面二个问题: 1.如果sql文件过大,会出现"MySQL server has gone away"问题; 2.如果sql文件数据有中文, ...
- WordPress主题开发:WP_Query使用分页实例
functions.php加入 <?php function lingfeng_custom_pagenavi( $custom_query,$range = 4 ) { global $pag ...
- FEC详解三
转自:http://blog.csdn.net/Stone_OverLooking/article/details/77752076 继续上文讲解: 3) 标准的RTP头结构如下所示: 其中第一个字节 ...
- 行尸走肉第一季/全集The Walking Dead迅雷下载
本季The Walking Dead 1 第一季(2010)看点:<行尸走肉>讲述了警察瑞克在一次执法行动中因中弹负伤而不省人事,当他从昏迷中苏醒后却惊讶地发现,这个世界已然天翻地覆.周遭 ...
- Charles抓包https
Charles抓包https 灰灰是只小贱狗 2018.05.08 10:46 字数 762 阅读 7800评论 3喜欢 3 抓取HTTPS请求包,对数据进行排查检验 1.安装Charles 2.电脑 ...
- ExtJS 4.2 教程-05:客户端代理(proxy)
转载自起飞网,原文地址:http://www.qeefee.com/extjs-course-5-client-proxy ExtJS 4.2 教程-01:Hello ExtJS ExtJS 4.2 ...
- 制作高仿QQ的聊天系统(下)—— Adapter & Activity
一.适配器 1.1 分页显示数据 因为聊天信息数目很多,所以adpter需要做分页处理,这里的分页处理是我自己实现的,如果有更好的办法欢迎在评论中告知.我们从友盟的反馈SDK中能得到聊天的list,我 ...
- 使用DDMS中的内存监测工具Heap来优化内存
最近在做一个照片墙的应用,涉及到很多知识,其中难点在于如何应对数量庞大的图片,这就涉及到内存管理的知识了.今天介绍的工具是DDMS中自带的Heap,它可以显示出当前引用占用的内存,剩余的内存等信息.下 ...