归并排序

来源:互联网 发布:十二生肖 知乎 编辑:程序博客网 时间:2024/06/06 05:48
归并排序是一种高效并且稳定的排序,即不会打乱数据原来的规律。算法的思路:1.先把数组递归分解为两部分;2.将两部分分别排序;3.最后将排好序的两部分合并在一起第三步,相比前两步要麻烦一些,方法是每次只需要把两个序列的最小元素相比较,删除其中的较小元素并加入合并后的新表即可。
#include <iostream>#include <algorithm>#define ML 1000using namespace std;void Merge_Sort(int *A, int l, int r, int *T)   //归并排序,A为需要排序的数组,T为一个附加数组,用于存放每次归并的结果{    if (r - l > 1)    {        int m = l + (r - l) / 2;    //划分为两部分        int p = l, q = m, i = l;        Merge_Sort(A, l, m, T);     //递归求解        Merge_Sort(A, m, r, T);        while (p < m || q < r)        {            if (q >= r || (p < m&&A[p] <= A[q]))    //从小到大排序            {                T[i] = A[p];    //从划分的左半数组复制到临时空间T                i++;                p++;            }            else            {                T[i] = A[q];    //从右半数组复制到临时空间                i++;                q++;            }        }        for (i = l; i < r; i++)        {            A[i] = T[i];        //从辅助空间T复制回A数组        }    }}int main(int argc, char *argv[]){    int n;    while (cin >> n)    {        int num[ML] = { 0 }, T[ML] = { 0 };        for (int i = 0; i < n; i++)        {            cin >> num[i];        }        Merge_Sort(num, 0, n, T);        for (int i = 0; i < n; i++)        {            cout << num[i] << ' ';        }    }    return 0;}
0 0
原创粉丝点击