算法搬运之归并排序
2016-03-24 10:53
183 查看
原文连接:/article/5085778.html
#include<iostream> using namespace std; //将有序数组ar[]和br[]合并到cr[]中 void MemeryArray(int a[], int n, int b[], int m, int c[]) { int i, j, k; i = j = k = 0; while (i < n && j < m) { if (a[i] < b[j]) c[k++] = a[i++]; else c[k++] = b[j++]; } while (i < n) c[k++] = a[i++]; while (j < m) c[k++] = b[j++]; } void PrintArr(int ar[],int n) { for(int i = 0; i < n; ++i) cout<<ar[i]<<" "; cout<<endl; } void main() { int ar[5] = {12, 23, 34, 45, 56}; int br[5] = {13, 24, 35, 46, 60}; int cr[10]; cout<<"数组ar为:"<<endl; PrintArr(ar, 5); cout<<"数组br为:"<<endl; PrintArr(ar, 5); MemeryArray(ar, 5, br, 5, cr); cout<<"合并后结果为:"<<endl; PrintArr(cr, 10); } /* 数组ar为: 12 23 34 45 56 数组br为: 12 23 34 45 56 合并后结果为: 12 13 23 24 34 35 45 46 56 60 */
#include<iostream> using namespace std; #define MAXSIZE 10 //将两个有序数列a[first...mid] 和 a[mid...last] 合并。 void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) temp[k++] = a[i++]; while (j <= n) temp[k++] = a[j++]; for (i = 0; i < k; ++i) a[first + i] = temp[i]; } void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边有序 mergesort(a, mid + 1, last, temp); //右边有序 mergearray(a, first, mid, last, temp); //再将两个有序数列合并 } } bool MergeSort(int a[], int n) { int *p = new int ; if (p == NULL) return false; mergesort(a, 0, n - 1, p); delete[] p; return true; } void PrintArr(int ar[],int n) { for(int i = 0; i < n; ++i) cout<<ar[i]<<" "; cout<<endl; } void main() { int ar[MAXSIZE] = {23, 34, 45, 78, 90, 12, 49, 92, 32, 19}; PrintArr(ar, MAXSIZE); bool bValue = MergeSort(ar, MAXSIZE); if(!bValue) { cout<<"MergeSort Failed!! "<<endl; } PrintArr(ar, MAXSIZE); }
#include<iostream> #include<malloc.h> using namespace std; #define MAXSIZE 10 void PrintArr(int ar[],int n) { for(int i = 0; i < n; ++i) cout<<ar[i]<<" "; cout<<endl; } static void merge(int ar[], int low, int mid, int high) { int i, k = 0; //申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 int *temp = (int *)malloc((high - low + 1)*sizeof(int)); int begin1 = low; int end1 = mid; int begin2 = mid + 1; int end2 = high; //比较两个元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 for (k = 0; begin1 <= end1 && begin2 <= end2;) { if(ar[begin1] < ar[begin2]) temp[k++] = ar[begin1++]; else temp[k++] = ar[begin2++]; } while(begin1 <= end1) //若第一个序列有剩余,直接拷贝出来粘到合并序列尾 temp[k++] = ar[begin1++]; while(begin2 <= end2) //若第二个序列有剩余,直接拷贝出来粘到合并序列尾 temp[k++] = ar[begin2++]; for (i = 0;i < k; i++) //将排序好的序列拷贝回数组中 { ar[low+i] = temp[i]; } free(temp); } void merge_sort(int ar[],int begin,int end) { int mid = 0; if(begin < end) { mid = (begin + end) / 2; merge_sort(ar, begin, mid); merge_sort(ar, mid + 1, end); merge(ar, begin, mid, end); } } void main() { int ar[] = {12, 14, 54, 5, 6, 3, 9, 8, 47, 89}; merge_sort(ar, 0, MAXSIZE-1); PrintArr(ar, MAXSIZE); } /* *3 5 6 8 9 12 14 47 54 89 */
相关文章推荐
- sql--表的修改
- MFC TIMER
- 如何优雅的解析C语言声明系统
- c++第二次上机作业-1
- PHP的错误机制总结
- 《世界是数字的》阅读笔记
- 测试java中类所占内存大小
- codeforces_609B. The Best Gift
- java调用hive api
- MDIO Clause 45 和Clause 22
- 关于梯度训练介绍,batch-GD, SGD, Mini-batch-GD, Stochastic GD, Online-GD
- review basics of Java
- Mason 入门例子1 --- 基本概念及建立空仿真
- leetcode 169. Majority Element
- c++程序项目1到项目3
- C++实验2-标准体重
- 半平面交 n^2和nlogn的模板
- java.sql.SQLException: SELECT command denied to user 'wzhpingsheng'@'127.0.0.1' for table 'table_adm
- 占位符动画插件Placeholdem
- cf#VK Cup 2015 - Qualification Round 2-C - Name Quest-贪心