分治与递归
编写自然归并合并排序算法
算法描述:对于初始给定的数组,通常存在多个长度大于 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;
}