算法初探——归并排序

来源:互联网 发布:帝江网络 编辑:程序博客网 时间:2024/06/06 20:41

借用大话数据结构的一个例子
如何得到全省的高考排名,其实就是每个市,每个县、每个学校、每个班级的排名合并后再排名得到的。
要比较两个学生的成绩是很容易的,比如甲比乙的分数低,丙比丁的分数低。那么我们也就可以合并得到甲乙丙丁的成绩排名。。。。以此类推,我们就可以得到全省的成绩排名了。

原理:假设初始记录序列含有n个记录,则可以看出是n个序列的子序列,每个子序列的长度为1,然后两两归并,得到【n/2】(向上取整)个长度为2或者1的子序列,再通过两两归并………直到得到一个长度为n的子序列。

过程如下图所示:
这里写图片描述

归并算法是建立在递归操作上的一种排序算法,是分治思想的典型应用。

#include "iostream"#include <vector>#include <algorithm>using namespace std;void comVector(vector<int> & arr, int start, int mid, int end);void mergesort(vector<int> & arr, int start, int end);void Show(int x);int main(){    vector<int> temp = { 12, 15, 18, 3, 9, 21 };    vector<int> a1 = { 2, 4, 6, 8, 1, 3, 5, 9 };    mergesort(a1, 0, a1.size() - 1);    for_each(a1.begin(), a1.end(), Show);    cout << endl;    cin.get();    return 0;}void mergesort(vector<int> & arr, int start, int end){    if (start<end)    {        int mid = (start + end) / 2;        mergesort(arr, start, mid);        //左半部分有序        mergesort(arr, mid + 1, end);      //右半部分有序        comVector(arr, start, mid, end);    }}void comVector(vector<int> & arr,int start ,int mid,int end){    vector<int> res;    int i = start, j = mid + 1;    int m = mid, n = end;    int k = 0;    while (i <= m &&j <= n)    {        if (arr[i] < arr[j])        {            res.push_back(arr[i]);            i++;        }        else        {            res.push_back(arr[j]);            j++;        }    }    while (i<=m)    {        res.push_back(arr[i]);        i++;    }    while (j <= n)    {        res.push_back(arr[j]);        j++;    }    for (int i = start; i <= end; i++)    {        arr[i] = res[k++];    }}void Show(int x){    cout << x << " ";}

很明显看出时间和空间复杂度。

0 0