《算法导论》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
- 《算法导论》3、合并排序实现(C++)
- 算法导论,合并排序,c实现。
- 算法导论合并排序算法python实现
- 读《算法导论》我来C语言实现(2)——合并排序
- 算法导论计数排序实现(C++)
- 算法导论--JAVA实现合并排序详解
- 算法导论(Introduction to Algorithms)之算法入门(插入排序与合并排序C语言实现)
- 合并排序算法函数(算法导论)
- 合并排序算法函数(算法导论)
- 算法导论学习日记(3)--合并排序
- 【算法导论】 2.3合并排序
- 【算法导论】合并排序法
- 算法导论:堆排序递归实现 (c语言)
- 算法导论:堆排序非递归实现(c语言)
- 《算法导论》1、插入排序实现(C++)
- 《算法导论》2、选择排序实现(C++)
- 《算法导论》5、冒泡排序实现(C++)
- 《算法导论》7、堆排序实现(C++)
- POJ 1562 Oil Deposits
- Android EventBus源码解析 带你深入理解EventBus
- 关于Mysql时间相减问题的bug
- Android 自定义可拖拽ListView,思想最重要。
- Spring定时器quartz配置
- 《算法导论》3、合并排序实现(C++)
- 数据库 - 数据依赖的公理系统
- OV7620摄像头使用
- 我在安装虚拟机和Hadoop过程中遇到的问题和解决方法
- Windows HOOK API (二)
- 191-number of 1 bits-字符串相关
- final关键字
- How long does it take to make a context switch?
- 字符串比较器