总体思想,将两个有序表合成一个有序表
方法一:迭代法
void merge_two(int in[], int out[], int low, int middle, int high){
int i, j, k;
for (i = low, j = middle + 1, k = low; i <= middle&&j <= high; k++){
if (in[i] < in[j])
out[k] = in[i++];
else
out[k] = in[j++];
}
while (i <= middle) out[k++] = in[i++];
while (j <= high) out[k++] = in[j++];
}
int* merge_all(int in[], int out[], int length){
int dk = 1;
int *p = in;
int *q = out;
int *tmp;
int *rf;
while(dk < length){ //步长不能超过length
int s = dk;
dk = s * 2;
int i = 0;
while (i + dk < length){
merge_two(p, q, i, i + s - 1, i + dk - 1);
i = i + dk;
}
if (i + s < length){ <span style="white-space:pre"> </span>//如果i+s>=length,无需处理,因为[i,s]是有序的
merge_two(p, q, i, i + s - 1, length - 1);
}
else{
while (i < length){
*(q + i) = *(p + i);
i++;
}
}
rf = q;<span style="white-space:pre"> </span>//rf指向最新的排列数组
//现在out[]存放的元素是部分有序的,我们把它作为目标数组,赋值给in[]
tmp = p; //或者 int* tmp=&in[0];
p = q;
q = tmp;
cout << "------------------------------------" << endl;
}
return rf;
}
方法二:递归法
void merge_two(int in[], int len,int low, int middle, int high){
int * out = new int[len];
int i, j, k;
for (i = low, j = middle + 1, k = low; i <= middle&&j <= high; k++){
if (in[i] < in[j])
out[k] = in[i++];
else
out[k] = in[j++];
}
while (i <= middle) out[k++] = in[i++];
while (j <= high) out[k++] = in[j++];
for (int s = low; s <= high; s++)
in[s] = out[s];
delete out;
}
void merge_digui(int in[],int len,int low, int high){
int mid;
if (low < high){
mid = (low + high) / 2;
merge_digui(in,len,low, mid);
merge_digui(in,len,mid + 1, high);
merge_two(in, len,low, mid, high);
}
}