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

来源:互联网 发布:淘宝什么时间上下架好 编辑:程序博客网 时间:2024/04/28 03:53

总体思想,将两个有序表合成一个有序表


方法一:迭代法

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++];elseout[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){//步长不能超过lengthint 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++];elseout[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);}}


0 0
原创粉丝点击