归并排序

来源:互联网 发布:软件行业就业形势 编辑:程序博客网 时间: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;}


原创粉丝点击