分治与递归

编写自然归并合并排序算法

算法描述:对于初始给定的数组,通常存在多个长度大于 1 的已自然排好序的子 数组段.例如,若数组 a 中元素为{4,8,3,7,1,5,6,2},则自然排好序的子数组段有 {4,8},{3,7},{1,5,6},{2}.用一次对数组 a 的线性扫描就足以找出所有这些排好序 的子数组段.然后将相邻的排好序的子数组段两两合并,构成更大的排好序的子 数组段({3,4,7,8},{1,2,5,6}).继续合并相邻排好序的子数组段,直至整个数组已排 好序。

 

#include <iostream>

using namespace std;

int main() {

     int a[100][100], p = 0, w = 1, c = 0;

     int ins[100], in = 0, *pi;

     int raw = 0;

     int array[100], n;

     int count;

    

     cout << "input the count of number:";

     cin >> count;

    

     cout << "input some number:";

     for (int k = 0; k < count; k++) {

         cin >> array[k];

     }

 

     int mark = -99999;

     for (int b = 0; b < count; b++) {

         if (mark == -99999) {

              mark = array[b];

              a[p][w] = mark;

              w++;

              a[p][0]++;

         } else if (array[b] < mark) {

              raw++;

              w = 1;

              p++;

              mark = array[b];

              a[p][w] = mark;

              w++;

              a[p][0]++;

         } else if (array[b] >= mark) {

              mark = array[b];

              a[p][w] = mark;

              w++;

              a[p][0]++;

         }

     }

     for (int n = 0; a[n][0] != 0; n++) {

         for (int z = 1; z <= a[n][0];z++)

              cout << a[n][z] << " ";

         cout << endl;

     }

     int final = 0;

     for (int z = 0; z <= raw -1; z++) {

         final = z+1;

         int *p1 = a[z];

         int *p2 = a[z+1];

         p1++;

         p2++;

         pi = ins;

         pi++;

         ins[0] = a[z][0] + a[z+1][0];

         int first = 0;

         while(a[z][0] != 0 || a[z+1][0] != 0) {

              if (first == 0) {

                   if (*p1 >= *p2) {

                       *pi = *p2;

                       p2++;

                       a[z+1][0]--;

                   } else {

                       *pi = *p1;

                       p1++;

                       a[z][0]--;

                   }

                   first++;

                   continue;

              }

              if (a[z+1][0] == 0) {

                   pi++;

                   *pi = *p1;

                   p1++;

                   a[z][0]--;

                   continue;

              }

              if (a[z][0] == 0) {

                   pi++;

                   *pi = *p2;

                   p2++;

                   a[z+1][0]--;

                   continue;

              }

              if (*p1 >= *p2) {

                   pi++;

                   *pi = *p2;

                   p2++;

                   a[z+1][0]--;

              } else {

                   pi++;

                   *pi = *p1;

                   p1++;

                   a[z][0]--;

              }

         }

         for (int n = 0; n <= ins[0]; n++)

              a[z+1][n] = ins[n];

     }

     for (int n = 1; n <= ins[0]; n++)

         cout << ins[n] << " ";

     return 0;

}

posted @ 2017-11-05 20:58  can丶  阅读(287)  评论(0编辑  收藏  举报