C++之归并排序(7)---《那些奇怪的算法》
2017-10-04 21:42
471 查看
由于快速排序算法的最快时间复杂度为O(nlogn),最慢为O(n^2),因此就有大牛研究能不能将其时间复杂度降到恒定为O(nlogn),于是归并排序就出现啦!
先划分,在归并,有些类似于快排:
运行结果:
参考:http://blog.csdn.net/a130737/article/details/38228369
先划分,在归并,有些类似于快排:
#include <iostream> using namespace std; void merge(int A[], int left[], int leftCount, int right[], int rightCount){ int i = 0, j = 0, k = 0; while (i < leftCount&&j < rightCount){ if (left[i] < right[j]){ A[k++] = left[i++]; } else{ A[k++] = right[j++]; } } while (i < leftCount) A[k++] = left[i++]; while (j < leftCount) A[k++] = right[j++]; } void mergeSort(int A[], int n){ int mid; int *left, *right; if (n < 2) return; mid = n / 2; left = new int[mid]; right = new int[n - mid]; for (int i = 0; i < mid; i++) left[i] = A[i]; for (int i = mid; i < n; i++) right[i - mid] = A[i]; mergeSort(left, mid); mergeSort(right, n - mid); merge(A, left, mid, right, n - mid); delete[] left; delete[] right; } int main(){ int A[] = { 10, 9, 1, 2, 6, 8, 7, 5, 3, 4 }; int len = sizeof(A) / sizeof(A[0]); mergeSort(A, len); for (int i = 0; i < len; i++){ cout << A[i] << " "; } cout << endl; return 0; }
运行结果:
参考:http://blog.csdn.net/a130737/article/details/38228369
相关文章推荐
- C++之数字容器装水问题(10)---《那些奇怪的算法》
- C++之整数转化为罗马数字(11)---《那些奇怪的算法》
- C++实现两个有序链表合并(17)---《那些奇怪的算法》
- C++之快速排序(3)---《那些奇怪的算法》
- C++之最长公共子串(最长子数组和)(22)---《那些奇怪的算法》
- C++之根据组合遍历顺序生成二叉树(25)---《那些奇怪的算法》
- C++之平衡二叉树的判定(25)---《那些奇怪的算法》
- C++之字符串的zipzag排列(9)---《那些奇怪的算法》
- C++之罗马数字转换为整型数字(12)---《那些奇怪的算法》
- C++之根据组合遍历顺序生成二叉树(25)---《那些奇怪的算法》
- C++之实现大顶堆(1)---《那些奇怪的算法》
- C++实现二叉树的镜像操作(18)---《那些奇怪的算法》
- C++之求解二叉树中所有从根节点到叶节点的所有路径(23)---《那些奇怪的算法》
- C++之最长回文字符串的判断(8)---《那些奇怪的算法》
- C++之堆的实现(5)---《那些奇怪的算法》
- C++之求取vector中三个元素和和给定元素最接近的值(15)---《那些奇怪的算法》
- C++之给定向量中4个元素的和等于给定值得向量和(16)---《那些奇怪的算法》
- C++之最长公共子序列(21)---《那些奇怪的算法》
- C++之实现两个链表合并(迭代和递归版本)(19)---《那些奇怪的算法》
- C++之树的层序遍历和深度优先遍历(先序遍历)(14)---《那些奇怪的算法》