归并排序(基于顺序容器vector_递归;基于数组array_递归_非递归)
来源:互联网 发布:sai软件详细介绍 编辑:程序博客网 时间:2024/06/05 18:57
代码1:基于顺序容器vector
1 /* 2 * FILE: merge_sort_vector.cpp 3 * --------------------------- 4 * DATE: 20170818 5 * 归并排序,使用顺序容器vector 6 * 7 */ 8 9 #include <iostream> 10 #include <vector> 11 12 void merge(std::vector<int> &v, std::vector<int> &v1, std::vector<int> &v2); 13 14 /* recursive 递归 一分两半 */ 15 void sort(std::vector<int> &v) 16 { 17 int n = v.size(); 18 if(n <= 1) 19 return; 20 std::vector<int> v1; 21 std::vector<int> v2; 22 for(int i = 0; i < n; i++) 23 { 24 if(i < n/2) 25 v1.push_back(v[i]); 26 else 27 v2.push_back(v[i]); 28 } 29 sort(v1); 30 sort(v2); 31 v.clear(); 32 merge(v, v1, v2); 33 } 34 35 /* 合并 排序 */ 36 void merge(std::vector<int> &v, std::vector<int> &v1, std::vector<int> &v2) 37 { 38 int n1 = v1.size(); 39 int n2 = v2.size(); 40 int p1 = 0, p2 = 0; 41 while(p1 < n1 || p2 < n2) 42 { 43 if(p1 >= n1) 44 v.push_back(v2[p2++]); 45 else if(p2 >= n2) 46 v.push_back(v1[p1++]); 47 else if(v1[p1] < v2[p2]) 48 v.push_back(v1[p1++]); 49 else 50 v.push_back(v2[p2++]); 51 } 52 } 53 54 /* 使用vector的迭代器 打印输出 */ 55 void display(std::vector<int> &v) 56 { 57 for(std::vector<int>::iterator iter = v.begin(); iter != v.end(); iter++) 58 std::cout<< *iter <<" "; 59 std::cout<< std::endl; 60 } 61 62 int main() 63 { 64 int a[] = {3,4,2,1,7,5,8,9,0,6}; 65 int length = sizeof(a) / sizeof(int); 66 std::vector<int> vec(a, a+length-1); 67 sort(vec); 68 display(vec); 69 return 0; 70 }
代码2:基于数组(递归法、非递归)
1 /* 2 * FIEL: merge_sort.cpp 3 * -------------------- 4 * DATE: 20170818 5 * 归并排序:先一分两半,分别进行排序;再合并两个已排好序的数组 6 * 7 */ 8 9 #include <iostream> 10 11 /* 12 * merge two sorted sub-array 13 * 合并两个已排好序的数组 14 */ 15 void merge(int a[], int result[], int begin, int middle, int length) 16 { 17 //int result[length]; 18 int left = begin, right = middle; 19 int index = begin; 20 while(left < middle || right < length) 21 { 22 if(left >= middle) 23 { 24 result[index++] = a[right++]; 25 //right++; 26 } 27 else if(right >= length) 28 { 29 result[index++] = a[left++]; 30 //left++; 31 } 32 else if(a[left] < a[right]) 33 { 34 result[index++] = a[left++]; 35 //left++; 36 } 37 else // a[left] >= a[right] 38 { 39 result[index++] = a[right++]; 40 //right++; 41 } 42 //index++; 43 } 44 for(int i = begin; i < length; i++) 45 a[i] = result[i]; 46 } 47 48 /* recursive 递归 */ 49 void mergeSort_recursive(int a[], int temp[], int begin, int length) 50 { 51 if(length - begin <= 1) 52 return; 53 int middle = (begin + length) / 2; 54 mergeSort_recursive(a, temp, begin, middle); 55 mergeSort_recursive(a, temp, middle, length); 56 merge(a, temp, begin, middle, length); 57 58 } 59 60 void mergeSort_recursive(int a[], int length) 61 { 62 int *temp = new int[length]; 63 mergeSort_recursive(a, temp, 0, length); 64 delete []temp; 65 } 66 67 /* non_recursive 非递归 */ 68 void mergeSort(int a[], int length) 69 { 70 int *temp = new int[length]; 71 for(int step = 1; step < length; step = step * 2) 72 { 73 for(int left = 0; left < length; left = left + 2 * step) 74 { 75 int middle = std::min(left + step, length); 76 int right = std::min(left + 2 * step, length); 77 merge(a, temp, left, middle, right); 78 } 79 } 80 delete []temp; 81 } 82 83 int main(int argc, char *argv[]) 84 { 85 int a[] = {3,4,2,1,7,5,8,9,0,6}; 86 int length = sizeof(a) / sizeof(int); 87 std::cout<< "递归法:"; 88 mergeSort_recursive(a, length); //递归法 89 for(int i = 0; i < length; i++) 90 std::cout<< a[i] << " "; 91 std::cout<< std::endl; 92 93 int b[] = {3,4,2,1,7,5,8,9,0,6}; 94 mergeSort(b, length); //非递归 95 std::cout<< "非递归:"; 96 for(int i = 0; i < length; i++) 97 std::cout<< b[i] << " "; 98 std::cout<< std::endl; 99 return 0;100 }
阅读全文
0 0
- 归并排序(基于顺序容器vector_递归;基于数组array_递归_非递归)
- 归并排序(递归与非递归)
- 归并排序(递归和非递归)
- 归并排序(非递归)
- 归并排序(非递归)
- 归并排序 非递归
- 归并排序非递归
- 归并排序(非递归)
- 归并排序(非递归)
- 归并排序数组实现之递归和非递归方法
- 数组小和 归并排序思路 递归、非递归求解
- 【排序】归并排序(递归和非递归版本)
- 合并排序(归并排序)的递归和非递归
- 归并排序实现 递归 非递归
- 归并排序 递归和非递归实现
- 归并排序 递归和非递归
- 归并排序 递归与非递归实现
- 归并排序递归和非递归实现
- Wireless Password HDU
- <1>——Two Sum
- 多重背包简介
- H.264 视频的 RTP 载荷格式
- 天线的长度和波长的关系
- 归并排序(基于顺序容器vector_递归;基于数组array_递归_非递归)
- So Easy! HDU
- 【JZOJ5284】 超级翻转
- chatterbot中get_response函数初步分析。
- arm neon 函数详解
- Java+Selenium3框架设计篇6-如何解决多条类下用例执行只启动一次浏览器的问题
- 从招聘网站爬取职位信息小窥IT发展
- 阿里云esc云服务器IP不能访问的解决办法
- 15. 3Sum