码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2015-12-24 00:29:05      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

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

// 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 << "\n";
}
/**
    设置随机数的种子
*/
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;
}

技术分享

归并排序

标签:

原文地址:http://www.cnblogs.com/david-zhao/p/5071699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!