标签:
向量有两部分,前半部分和后半部分分别已经排序,合并,排序并归并到一个向量中。
// 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