归并排序(mergeSort)
2016-03-26 11:06
363 查看
#include <iostream> #include <math.h> //合并两个排序好的数组 void Merge(int* parray, int start, int middle, int end) { std::cout<<start<<"+"<<middle<<"+"<<end<<std::endl; int n1 = middle -start+1; int n2 = end - middle; int* pLarray = new int[n1]; int* pRarray = new int[n2]; for (int i = 0; i < n1; i++) { pLarray[i] = parray[start + i]; } for (int i = 0; i < n2; i++) { pRarray[i] = parray[middle + i+1]; } //运用算法导论中在数组底部加入哨兵牌,以推断出那个数组到底了 //这里不采用哨兵牌的方式 int i = 0; int j = 0; int k = start; while (i<n1&&j<n2) { if (pLarray[i]<pRarray[j]) { parray[k++] = pLarray[i++]; } else { parray[k++] = pRarray[j++]; } } for (; i < n1 ;i++) //左边数组有剩余元素时 { parray[k++] = pLarray[i]; } for (; j < n2 ;j++) //右边数组有剩余元素时 { parray[k++] = pRarray[j]; } //输出 for (int a = start;a <end+1; a++) { std::cout<<parray[a]<<" "; } std::cout<<std::endl; if (pRarray != NULL) { delete pRarray; } if (pLarray != NULL) { delete pLarray; } } //归并排序递归的主体。 void MergeSort(int * parray,int start, int end) { std::cout<<start<<"+"<<end<<std::endl; int middle; if (start<end) { middle = floor((end + start)/2.); MergeSort(parray,start,middle); MergeSort(parray,middle+1,end); Merge(parray,start,middle,end); } } //测试程序 int main() { //产生一个待排序的数组 int* pA = new int[888]; for (int i=0;i<888;i++) { pA[i] = std::rand()%888; } for (int i=0; i<888; i++) { std::cout<<pA[i]<<std::endl; } MergeSort(pA,0,887); //输出 for (int i=0; i<888; i++) { std::cout<<pA[i]<<std::endl; } system("pause"); }
相关文章推荐
- java实现归并排序算法
- C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- C++实现自底向上的归并排序算法
- C++实现自顶向下的归并排序算法
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- Java排序算法总结之归并排序
- C++归并排序算法实例
- Javascript排序算法之合并排序(归并排序)的2个例子
- 归并排序的递归实现与非递归实现代码
- java二路归并排序示例分享
- java实现归并排序算法
- 归并排序的实现代码与思路
- leetcode 虐我篇之(二) Two Sum
- In-place Merge Sort 原地并归排序
- 使用Java完成《算法导论》习题2.3-2
- 插入排序移动次数
- 归并排序 with Python
- 归并排序-逆序对的求解
- 排序算法的复杂度和稳定性
- 用python实现归并排序