各种排序算法的实现-3(2路插入排序)
来源:互联网 发布:2008年nba西部决赛数据 编辑:程序博客网 时间:2024/06/03 17:07
这种排序在 折半插入排序的基础上更进一步, 比较次数更少了,先利用一个辅助空间,相同的就可以了。
首先看一下折半查找算法, 折半查找可以用递归来写 也可以用 循环。
template<typename T>int serach(T *p, int len, T key){T low, high;high = len;low = 0;while (low <= high){int mid = (low + high) / 2;if (*(p + mid) == key){return mid;}if (*(p + mid) > key){high = mid - 1;}if (*(p + mid) < key){low = mid + 1;}}return -1;}
这是 用循环的方式写的 , 如果查找得到了 需要找的元素 则返回该位置, 如果没找到, 则返回-1.
再进行二路插入排序的过程中, 实际上就是两个 有序的序列 进行插入, 最后合一起。
下面是给出的例子代码:
template<typename T>int serach(T *p, int len, T key){T low, high;high = len;low = 0;while (low <= high){int mid = (low + high) / 2;if (*(p + mid) == key){return mid;}if (*(p + mid) > key){high = mid - 1;}if (*(p + mid) < key){low = mid + 1;}}return low;}template<typename T>int sort(T *src, T *dst, int len){*dst = *src;int final = 1, first = len;for (int i = 1; i < len; i++){if (*(src + i) >= *dst){if (final == 1)//第一次直接赋值{*(dst + final) = *(src + i);final++;continue;}//////////////////////////////////////////////////////////////////////////int pos = serach(dst, final, *(src + i));if (pos == final)//比最后一个值 还要大{*(dst + final) = *(src + i);final++;if (final == first){return final;}continue;}memcpy(dst + pos + 1, dst + pos, sizeof(T) * (final- pos));*(dst + pos) = *(src + i);final++;//////////////////////////////////////////////////////////////////////////}else{if (first == len)//第一次插入的时候 后面没有值{*(dst + len - 1) = *(src + i);first --;if (final == first){return final;}continue;}//////////////////////////////////////////////////////////////////////////int pos = serach(dst + first, len - first + 1, *(src + i));if (pos == 0)//比第一个还要小{*(dst + first - 1) = *(src + i);first--; if (final == first){return final;}continue;}else//集体后移 腾出空间来{memcpy(dst + first - 1, dst + first, sizeof(T) * (pos) );*(dst + first + pos - 1) = *(src + i);first--;if (final == first){return final;}}//////////////////////////////////////////////////////////////////////////}}return final;}int main(int argc, char* argv[]){int src[7] = { 1000, 12, 40, 704, 33, 999, 0 };int dst[7] = {0};int final = sort(src, dst, 7);printf("%d\n", final);for (int i = 0; i < 7; i++){printf("%d ", dst[i]);}system("pause");return 0;}
如果大家认为可以优化的地方,或者代码有什么错误 欢迎大家指正。 这是1000人C++ 群: C语言/C++/STL/linux/MFC/WTL 77278127 欢迎大家进来讨论
0 0
- 各种排序算法的实现-2(折半插入排序)
- 各种排序算法的实现-3(2路插入排序)
- 各种排序算法的实现-5(表插入排序-2)
- 各种排序算法的实现-1(直接插入排序)
- 各种排序算法的场景以及c++实现(插入排序,希尔排序,冒泡排序,快速排序,选择排序,归并排序)
- 排序算法集合(2)-C#实现的插入排序
- 排序算法(2)插入排序的编程语言实现
- 各种排序算法的实现-4(表插入排序-1)
- 排序算法--插入排序(直接插入排序、折半插入、shell排序)的java实现
- java实现排序算法之2-路插入排序,直接插入排序,折半插入排序
- java实现各种排序算法(包括冒泡排序,选择排序,插入排序,快速排序(简洁版))及性能测试
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- 各种排序算法的实现
- java编码习惯
- 简单的bind实现
- android 往dialog中加入listview,并实现listview中item的点击事件
- VC之键盘响应相关
- JVM,JRE,JDK
- 各种排序算法的实现-3(2路插入排序)
- android SpannableString使用详解
- DSP 学习指南
- 关于arrayList的add和addall
- android native开发环境搭建
- 浅谈Java内部类的四个应用场景
- timerfd的简单应用一例
- <版本控制>Windows下搭建VisualSVN服务端与客户端
- 选择排序与冒泡排序的比较