算法导论——2.3-2无哨兵情况下的归并排序

来源:互联网 发布:php登录页面完整代码 编辑:程序博客网 时间:2024/06/06 00:43

没有哨兵时,可以设置一个判断,只要2个分数组的一个到达底端就把另一个的后续元素赋给原数组。具体如下:

#include<iostream>using namespace std;const int sentry = 999999;void Merge(int ia[], size_t p, size_t q, size_t r){int a1[10], a2[10];size_t len1 = q - p + 1, len2 = r - q;for (int i = 0; i <len1; ++i)a1[i] = ia[p + i];//a1[len1] = sentry;for (int i = 0; i <len2; ++i)a2[i] = ia[q + i + 1];//a2[len2] = sentry;int b = 0, c = 0;for (int i = p; i <= r; ++i){if (b !=len1 && c !=len2)        //只有在b没有到达len1且c没有到达len2时才会将小的值给ia{if (a1[b] >= a2[c])ia[i] = a2[c++];elseia[i] = a1[b++];}else { if (b == len1)//如果b取到len1,那就把a2数组一次赋给iafor (int j = c; j < len2; ++j)ia[i] = a2[j];if (c == len2)//如果c取到len2,那就把a1数组一次赋给iafor (int j = b; i < len1; ++j)ia[i] = a1[j];}}}void Merge_sort(int ia[], size_t p, size_t r){if (p < r){int q = (p + r) / 2;Merge_sort(ia, p, q);Merge_sort(ia, q + 1, r);Merge(ia, p, q, r);}}int main(){int a[20];int n;cout << "input the size of array:" << endl;cin >> n;for (int i = 0; i < n; ++i)cin >> a[i];//input arrayMerge_sort(a, 0, n - 1);for (int i = 0; i < n; ++i)cout << a[i] << " ";cout << endl;return 0;}





0 0
原创粉丝点击