归并排序
来源:互联网 发布:软件行业就业形势 编辑:程序博客网 时间:2024/06/10 20:36
点:归并排序,二分的思想
题意:归并排序
思路:归并排序很可能不是直接的面试题,但它的思想会用于很多其他的面试题的思路。
归并的思想:
1、不断的二分,直到最终分为一组组单对单pk的时候(对于代码就是递归的二分,直到start==end),然后pk出大小,形成一个个的两元素的有序组合
2、一个个的两元素的组合,再进行2v2的pk,形成有序的四元素组合,进而是更多元素的有序组合(pk就是递归结束后出栈处理)
3、最终形成整个的有序组合
总之就是二分递归入栈,直到分成1v1时递归停止,然后开始递归出栈处理也就是pk。
另外归并排序之所以能达到稳稳的o(nlogn)的时间复杂度,是因为其pk排序时的手段是使用了额外的空间进行比较插入,使每次的N个元素的pk的时间复杂度都是O(N)才能达到的。
代码:
#include <iostream>#include <random>void merge (int *data, int st1, int ed1, int st2, int ed2) { int start = st1; int *tmp = new int[ed2 - st1 + 1]; int i = 0; while (st1 <= ed1 && st2 <= ed2) { if (data[st1] <= data[st2]) { tmp[i++] = data[st1++]; continue; } if (data[st2] <= data[st1]) { tmp[i++] = data[st2++]; continue; } } while (st1 <= ed1) { tmp[i++] = data[st1++]; } while (st2 <= ed2) { tmp[i++] = data[st2++]; } for (int idx = 0; idx < i; idx++) { data[start + idx] = tmp[idx]; } delete []tmp;}void mergesort (int *data, int size, int st, int ed) { if (ed == st) { return; } int mid = (st + ed)/2; mergesort(data, size, st, mid); mergesort(data, size, mid + 1, ed); merge(data, st, mid, mid + 1, ed);}void Mergesort (int *data, int size) { mergesort(data, size, 0, size - 1);}int main () { std::random_device rd; int data[20]; for (int i = 0; i < 20; i++) { int cur = rd() % 100; data[i] = cur; std::cout << cur << "\t"; } std::cout << std::endl; Mergesort(data, sizeof(data)/sizeof(data[0])); for (int i = 0; i < 20; i++) { std::cout << data[i] << "\t"; } std::cout << std::endl; return 0;}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 数据结构当中的图怎么都弄不懂怎么办?
- Power of Matrix UVA
- 【LeetCode】Contains Duplicate II 解题报告
- 2017.08.18【NOIP提高组】模拟赛B组总结
- POJ
- 归并排序
- 这是我刚接触博客的第一个测试博客
- 链表、头指针、头结点
- 【jzoj5306】【NOIP2017提高A组模拟8.18】【棋盘游戏】
- hdu 6143-动态规划
- [jzoj5307]【NOIP2017提高A组模拟8.18】偷窃
- Android模块化开发
- 保持对象成员私有
- 判断网络连接