算法与数据结构学习 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);
}
}
方法一:迭代法
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);
}
}
相关文章推荐
- 《数据结构与算法——C语言实现》学习笔记——归并排序
- 一步步学习数据结构和算法之归并排序效率分析及java实现
- 数据结构&算法学习笔记: 归并排序
- 数据结构学习笔记 --- 排序(归并排序、基数排序)
- 小蚂蚁学习数据结构(26)——题目——输出二叉树上值大于x的算法
- 数据结构学习:KMP模式匹配算法
- 数据结构和算法-学习笔记3
- 算法学习笔记--归并排序
- 【算法与数据结构】B-树学习笔记
- 《Delphi 算法与数据结构》学习与感悟[2]: 数据对齐
- 数据结构和算法学习笔记——图论
- 算法学习-归并排序和二分查找
- [算法学习笔记]分而治之——归并排序
- 算法设计和数据结构学习_4(《数据结构和问题求解》part4笔记)
- 数据结构学习笔记 --- 排序(归并排序、基数排序)
- 一步步学习数据结构和算法之希尔排序效率分析及java实现
- 数据结构 P20 算法实现 —A=AUB和归并排序
- 算法系统学习-1排序-归并排序
- 数据结构之简单算法学习
- 数据结构与算法学习-哈希表入门