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

      1 /*
      2 归并排序,需要多一倍的内存空间
      3 速度和快速排序一样快
      4 */
      5 
      6 #include<iostream>
      7 #include<algorithm>
      8 
      9 using namespace std;
     10 
     11 template<class T>
     12 void MergeSort(T *initlist, T *resultlist, const int l, const int m, const int n)
     13 {
     14     int i1, i2, iresult;
     15     for (i1 = l, i2 = m + 1, iresult = l; i1 <= m && i2 <= n; iresult++)
     16     {
     17         if (initlist[i1] <= initlist[i2])
     18         {
     19             resultlist[iresult] = initlist[i1];
     20             i1++;
     21         }
     22         else
     23         {
     24             resultlist[iresult] = initlist[i2];
     25             i2++;
     26         }
     27     }
     28     std::copy(initlist+i1, initlist+ m+1, resultlist+iresult);//将比较完剩下的放进结果数组
     29     std::copy(initlist+i2, initlist+ n + 1, resultlist+iresult);
     30 
     31 }
     32 
     33 template<class T>
     34 void MergePass(T *initList,T *resultList,const int n,const int s)
     35 {
     36     int i;
     37     for (i = 1; i <= n - 2 * s + 1; i += 2 * s)
     38     {
     39         MergeSort(initList,resultList,i,i+s-1,i+2*s-1);
     40     }
     41     if ((i + s - 1) < n)//有剩余的
     42         MergeSort(initList, resultList, i, i + s - 1, n);
     43     else
     44         copy(initList + i, initList + n + 1, resultList + i);
     45 }
     46 
     47 template <class T>
     48 void Merge(T *a, const int n)
     49 {
     50     T *tempList = new int[n + 1];//tempList[0]不用
     51     for (int l = 1; l < n; l *= 2)
     52     {
     53         MergePass(a,tempList,n,l);
     54         l *= 2;
     55         MergePass(tempList,a,n,l);
     56     }
     57     delete[] tempList;//删除临时数组空间,防止内存泄漏
     58 }
     59 
     60 
     61 int main()
     62 {
     63     int a[] = { 0,23,47,81,95,7,14,39,55,62,74 };
     64     int b[11] = { 0 };
     65     MergeSort(a, b, 1, 4, 10);
     66     for (int i = 1; i < 11; i++)
     67     {
     68         cout << b[i] << " ";
     69     }
     70     cout << endl;
     71 
     72     int m[] = {0,26,5,77,1,61,11,59,15,48,19};
     73     int n[11] = { 0 };
     74     MergePass(m,n,10,1);
     75     cout << "第一次归并:" << endl;
     76     for (int i = 1; i < 11; i++)
     77         cout << n[i] << " ";
     78     cout << endl;
     79 
     80     MergePass(n, m, 10, 2);
     81     cout << "第二次归并:" << endl;
     82     for (int i = 1; i < 11; i++)
     83         cout << m[i] << " ";
     84     cout << endl;
     85 
     86     MergePass(m, n, 10, 4);
     87     cout << "第三次归并:" << endl;
     88     for (int i = 1; i < 11; i++)
     89         cout << n[i] << " ";
     90     cout << endl;
     91 
     92     MergePass(n, m, 10, 8);
     93     cout << "第四次归并:" << endl;
     94     for (int i = 1; i < 11; i++)
     95         cout << m[i] << " ";
     96     cout << endl;
     97 
     98     cout << "上面的都是中间结果的测试" << endl;
     99     cout << "下面开始测试归并排序的最后结果" << endl;
    100     int x[] = {0,26,5,77,1,61,11,59,15,48,19};
    101     Merge(x,10);
    102     for (int i = 1; i < 11; i++)
    103         cout << x[i] << " ";
    104     cout << endl;
    105     system("pause");
    106     return 0;
    107 }

    vs2015中运行结果:

  • 相关阅读:
    Android下的多线程
    01背包问题
    用锐捷使你的笔记本成为WIFI基站,让其他电脑还有我们的手机使用无线上网吧
    如何在eclipse的android工程中添加外部javadoc.jar包,方便开发
    umask函数的用处
    支持我一下吧!
    ios越狱内购提示Environment:Sandbox
    plt_System_Security_Cryptography_HMAC_KeySetup_byte___byte
    蛋疼的时候写三消游戏(十二)
    cocos2dx做游戏(搭建环境)
  • 原文地址:https://www.cnblogs.com/luanxin/p/8907435.html
Copyright © 2011-2022 走看看