《算法导论》3、合并排序实现(C++)

来源:互联网 发布:人工智能权威杂志 编辑:程序博客网 时间:2024/05/01 17:18

首先来个最简单的:

#include <iostream>using namespace std;void MergeSort(int a[], int p, int r);void Merge(int a[], int p, int q, int r);//使用哨兵元素void Merge1(int *a, int p, int q, int r);//不用哨兵元素void main(){int a[20] = { 31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 };MergeSort(a, 0, 19);for (int i = 0; i < 20; i++){cout << a[i] << "  ";}cout << endl;system("pause");}void Merge(int *a, int p, int q, int r)//使用哨兵元素{int n1 = q - p + 1;int n2 = r - q;int i = 0;int j = 0;int k = 0;int *L = new int[n1 + 1];//n1+1为长度,不是最后一个元素的下标int *R = new int[n2 + 1];for (i = 0; i < n1; i++)L[i] = a[p + i];for (j = 0; j < n2; j++)R[j] = a[q + j + 1];L[n1] = 100000;R[n2] = 100000;for (i = 0, j = 0, k = p; k <= r; k++){if (L[i] <= R[j]){a[k] = L[i];i++;}else{a[k] = R[j];j++;}}delete []L;delete []R;}void MergeSort(int *a, int p, int r){if (p<r){int q = (p + r) / 2;MergeSort(a, p, q);MergeSort(a, q + 1, r);Merge1(a, p, q, r);}}void Merge1(int *a, int p, int q, int r) //不用哨兵元素{int n1 = q - p;int n2 = r - q - 1; int i = 0;int j = 0;int k = 0;int *L = new int[n1 + 1];//n1+1为长度,不是最后一个元素的下标int *R = new int[n2 + 1];for (i = 0; i <= n1; i++)L[i] = a[p + i];for (j = 0; j <= n2; j++)R[j] = a[q + j + 1];for (i = 0, j = 0, k = p; k <= r; k++){if (L[i] <= R[j] && i<=n1 && j<=n2){a[k] = L[i];i++;}else if (L[i] > R[j] && i <= n1 && j <= n2){a[k] = R[j];j++;}else if (i > n1){a[k] = R[j];j++;}else if (j > n2){a[k] = L[i];i++;}}delete[]L;delete[]R;}

然后来个和插入排序结合起来的:

#include <iostream>using namespace std;void MergeSort(int a[], int p, int r);void Merge(int a[], int p, int q, int r);//使用哨兵元素void Merge1(int *a, int p, int q, int r);//不用哨兵元素void insertSort(int a[], int p, int q);void main(){int a[200] = { 31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 ,31, 41, 59, 26, 41, 58, 66, 77, 88, 99, 12, 13, 11, 14, 56, 43, 12, 98, 123, 144 };MergeSort(a, 0, 199);for (int i = 0; i < 200; i++){cout << a[i] << "  ";}cout << endl;system("pause");}void Merge(int *a, int p, int q, int r)//使用哨兵元素{int n1 = q - p + 1;int n2 = r - q;int i = 0;int j = 0;int k = 0;int *L = new int[n1 + 1];//n1+1为长度,不是最后一个元素的下标int *R = new int[n2 + 1];for (i = 0; i < n1; i++)L[i] = a[p + i];for (j = 0; j < n2; j++)R[j] = a[q + j + 1];L[n1] = 100000;R[n2] = 100000;for (i = 0, j = 0, k = p; k <= r; k++){if (L[i] <= R[j]){a[k] = L[i];i++;}else{a[k] = R[j];j++;}}delete []L;delete []R;}void MergeSort(int *a, int p, int r){if (r - p > 50){int q = (p + r) / 2;MergeSort(a, p, q);MergeSort(a, q + 1, r);Merge(a, p, q, r);}elseinsertSort(a, p, r);}void Merge1(int *a, int p, int q, int r) //不用哨兵元素{int n1 = q - p;int n2 = r - q - 1; int i = 0;int j = 0;int k = 0;int *L = new int[n1 + 1];//n1+1为长度,不是最后一个元素的下标int *R = new int[n2 + 1];for (i = 0; i <= n1; i++)L[i] = a[p + i];for (j = 0; j <= n2; j++)R[j] = a[q + j + 1];for (i = 0, j = 0, k = p; k <= r; k++){if (L[i] <= R[j] && i<=n1 && j<=n2){a[k] = L[i];i++;}else if (L[i] > R[j] && i <= n1 && j <= n2){a[k] = R[j];j++;}else if (i > n1){a[k] = R[j];j++;}else if (j > n2){a[k] = L[i];i++;}}delete[]L;delete[]R;}void insertSort(int a[], int p,int q){if (q-p > 1){insertSort(a, p, q - 1);int j = p;int temp = a[q];for (j = q; j > p; j--){if (a[j - 1] > temp){a[j] = a[j - 1];}elsebreak;}a[j] = temp;}}


0 0
原创粉丝点击