数据结构 - 2-路插入排序 详解 及 代码(C++)
2014-04-21 18:50
459 查看
2-路插入排序 详解 及 代码
本文地址: http://blog.csdn.net/caroline_wendy/article/details/242676792-路插入排序的思想很有意思:
通过一个辅助的循环数组, 如果大于最大的元素, 则插入至尾部, 如果小于最小的元素, 则插入至头部,
如果在两者之间, 采用折半查找的方式,移动一部分的元素;
设计到循环数组的中间值的查找和数据移动的问题.
由于折半查找可以减少比较次数,
首尾插入又不需要移动元素, 即移动次数约为[(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
相关文章推荐
- 数据结构 - 直接插入排序(Straight Insertion Sort) 详解 及 代码(C++)
- 数据结构 - 2-路插入排序 具体解释 及 代码(C++)
- C++代码,数据结构-内部排序-插入排序-2-路插入排序
- C++代码,数据结构-内部排序-插入排序-表插入排序
- C++代码,数据结构-内部排序-插入排序-直接插入排序
- 数据结构 - 冒泡排序(Bubble Sort) 详解 及 代码(C++)
- 插入排序的C++代码实现
- 数据结构 - 表插入排序 详解 及 代码(C++)
- 数据结构 - 希尔排序(Shell's Sort) 详解 及 代码(C++)
- C++数据结构--直接插入排序
- javascript数据结构之双链表插入排序实例详解
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- 数据结构 - 快速排序(Quick Sort) 详解 及 代码(C++)
- C++代码,数据结构-内部排序-交换排序-起泡排序
- 数据结构 - 折半插入排序(Binary Insertion Sort) 详解 及 代码(C++)
- 插入排序、冒泡排序、选择排序、希尔排序、快速排序、归并排序、堆排序和LST基数排序的C++代码实现
- C++数据结构 排序 二分 插入 冒泡 基数 归并 直选 快排 希尔 堆排序
- 数据结构 - 树形选择排序 (tree selection sort) 详解 及 代码(C++)
- C++代码,数据结构-内部排序-交换排序-快速排序
- 直接插入排序的C++实现代码