zoukankan      html  css  js  c++  java
  • 归并排序(非原地版)

    归并排序

    递归版

    #include <iostream>
    using namespace std;
    
    // reg 是临时存储归并结果的数组
    void merge(int* arr, int* reg, int start, int end) {
        if (start >= end)
            return;
        int left = start;
        int right = end;
        int mid = (left + right) / 2;
        merge(arr, reg, left, mid);
        merge(arr, reg, mid + 1, right);
        int start1 = left;
        int start2 = mid + 1;
        int resIdx = left;
        while (start1 <= mid && start2 <= right) {
            reg[resIdx++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
        }
        while (start1 <= mid) {
            reg[resIdx++] = arr[start1++];
        }
        while (start2 <= right) {
            reg[resIdx++] = arr[start2++];
        }
        // 将reg中的归并结果回填到arr中
        for (resIdx = start; resIdx <= end; resIdx++) {
            arr[resIdx] = reg[resIdx];
        }
    }
    
    void mergeSort(int* arr, int* reg, const int size) {
        merge(arr, reg, 0, size - 1);
    }
    
    int main() {
        int size, i;
        cin >> size;
        int *arr = new int[size];
        for (i = 0; i < size; i++) {
            cin >> arr[i];
        }
        int *reg = new int[size];
        mergeSort(arr, reg, size);
        cout << endl;
        cout << "Result:" << endl;
        for (i = 0; i < size; i++) {
            cout << arr[i] << " ";
        }
        cout << endl;
        delete [] arr;
        delete [] reg;
        return 0;
    }
    

    迭代版

    #include <iostream>
    using namespace std;
    
    void mergeSort(int arr[], int len) {
        int *a = arr;
        int *b = new int[len];
        int seg, start;
        for (seg = 1; seg < len; seg++) { //每轮增大归并段长度
            for (start = 0; start < len; start += seg + seg) { // 每轮按照固定归并段长度归并所有数据
                int mid = min(start + seg, len), end = min(start + seg + seg, len);
                int start1 = start, end1 = mid, start2 = mid, end2 = end;
                int k = start;
                while (start1 < end1 && start2 < end2) {
                    b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
                }
                while (start1 < end1) {
                    b[k++] = a[start1++];
                }
                while (start2 < end2) {
                    b[k++] = a[start2++];
                }
            }
            swap(a, b); // 每次进行归并的时候,b代表新数据,a代表旧数据,所以要进行交换
        }
        if (a != arr) {  // a在每次循环结束之后都是代表最新数据,所以要保证最新数据回填
            for (int i = 0; i < len; i++)
                b[i] = a[i];
            b = a;
        }
        delete [] b;
    }
    
    int main() {
        int size;
        cin >> size;
        if (size <= 0)
            return -1;
        int *arr = new int[size];
        int i;
        for (i = 0; i < size; i++) {
            cin >> arr[i];
        }
        mergeSort(arr, size);
        for (i = 0; i < size; i++) {
            cout << arr[i] << " ";
        }
        cout << endl;
        return 0;
    }
    
  • 相关阅读:
    javascript 离开网页时 触发函数
    dhl:简单的WebConfig加密 连接字符加密解密
    javascript获取网页URL地址及参数等
    dhl:img 的src 在 ie7下是将全路径。>ie8和firefox没有问题
    有趣有用网址大全
    VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称
    iis6配置支持.net4.0
    闲语MVC3和Razor 转自:啊不
    dhl:4.0服务器端控件
    如何在C#中实现窗体全屏模式
  • 原文地址:https://www.cnblogs.com/yanhewu/p/8278902.html
Copyright © 2011-2022 走看看