zoukankan      html  css  js  c++  java
  • 归并排序

    向量有两部分,前半部分和后半部分分别已经排序,合并,排序并归并到一个向量中。

    // mersort.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <vector>
    #include <cstdlib>
    #include <ctime>
    
    using namespace std;
    /**
        在同一个向量中合并两个相邻的范围区域
        @param a 要合并的向量中元素
        @param from 第一个range的开始
        @param mid 第一个range的结束
        @param to 第二个range的结束
    */
    void merge(vector<int>& a, int from, int mid, int to)
    {
        int n = to - from + 1;    //要合并的range的size
        /* 合并两等分为一个向量b */
        vector<int> b(n);
    
        int i1= from;
        /* 在第一个half中考虑的下一个元素 */
        int i2 = mid + 1;
        /* 在第二个half中考虑的下一个元素 */
        int j = 0; /* b中的下一个开始的位置 */
        /**
            无论是 i1 或者 i2 通过结尾,移动较小的元素到b
        */
        while (i1 <= mid && i2 <= to)
        {
            if (a[i1] < a[i2])
            {
                b[j] = a[i1];
                i1++;
            }
            else 
            {
                b[j] = a[i2];
                i2++;
            }
            j++;
        }
        /*
            当在你下面的循环执行的时候标记这两个其中的一个
        */
        /*
            复制第一个half剩下的
        */
        while ( i1 <= mid)
        {
            b[j] = a[i1];
            i1++;
            j++;
        }
        /* 复制第二个half剩下的 */
        while ( i2 <= to )
        {
            b[j] = a[i2];
            i2++;
            j++;
        }
        /* 从临时向量复制回来 */
        for ( j = 0; j < n; j++)
            a[from + j] = b[j];
    }
    
    /**
        在一个向量的区域里排序元素
        @param a 要排序的向量的元素
        @param from 要排序的range的开始
        @param to 要排序的range的结尾
    */
    void merge_sort(vector<int>& a, int from, int to)
    {
        if (from == to) return;
        int mid = (from + to) / 2;
        /* 排序第一个和第二个half */
        merge_sort(a, from, mid);
        merge_sort(a, mid + 1, to);
        merge(a, from, mid, to);
    }
    
    /**
        在一个向量中打印出来所有的元素
        @param a 要打印的向量
    */
    void print(vector<int> a)
    {
        for (int i = 0; i < a.size(); i++)
            cout << a[i] << " ";
        cout << "
    ";
    }
    /**
        设置随机数的种子
    */
    void rand_seed()
    {
        int seed = static_cast<int>(time(0));
        srand(seed);
    }
    
    /**
        计算一个range中的随机初始值
        @param a range的底部
        @param b range的顶部
        @return 一个随机值x, a <= x 并且 x<= b
    */
    int rand_int(int a, int b)
    {
        return a+ rand() % ( b - a + 1);
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        rand_seed();
        vector<int> v(20);
        for (int i = 0; i < v.size(); i++)
            v[i] = rand_int(1, 100);
        print(v);
        merge_sort(v, 0, v.size() - 1);
        print(v);
        system("pause");
        return 0;
    }

  • 相关阅读:
    LeetCode90.子集 ||
    Ubuntu下的Matlab安装
    FAQ
    青石板
    交叉熵损失函数
    tf常用函数
    激活函数
    SGD和GD的区别
    卷积神经网络
    Ubuntu安装Matlab2016b
  • 原文地址:https://www.cnblogs.com/david-zhao/p/5071699.html
Copyright © 2011-2022 走看看