您的位置:首页 > 理论基础 > 数据结构算法

算法与数据结构学习 08 归并排序

2015-05-24 21:35 211 查看
总体思想,将两个有序表合成一个有序表

方法一:迭代法

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])

acf5
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: