码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2015-07-17 20:46:25      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:

归并排序是分治算法的一个典型的体现:
    将原问题分解为若干的子问题进行求解就可以了。

分治算法的步步骤:

技术分享

归并排序的步骤:

技术分享

技术分享
第2-4行将原问题分成子问题,第5行将这些子问题进行合并。

技术分享

  1. #ifndef MERGE_SORT_H
  2. #define MERGE_SORT_H
  3. void mergeArr(int left,int mid,int right,int *arr);
  4. void mergeSort(int left,int right,int *arr);
  5. void mergeArr(int left,int mid,int right,int *arr){
  6. int leftLen=mid-left+1;
  7. int rightLen=right-mid;
  8. int *leftsubArr=new int[leftLen];
  9. int *rightsubArr=new int[rightLen];
  10. for(int i=left;i<=mid; i++){
  11. leftsubArr[i-left]=arr[i];
  12. }
  13. for(int i=mid+1;i<=right; i++){
  14. rightsubArr[i-mid-1]=arr[i];
  15. }
  16. int i=0;
  17. int j=0;
  18. while(i<leftLen&&j<rightLen){
  19. if(leftsubArr[i]<=rightsubArr[j]){
  20. arr[left+i+j]=leftsubArr[i];
  21. i++;
  22. }else{
  23. arr[left+i+j]=rightsubArr[j];
  24. j++;
  25. }
  26. }
  27. while(i<leftLen||j<rightLen){
  28. if(i==leftLen&&j<rightLen){
  29. arr[left+i+j]=rightsubArr[j];
  30. j++;
  31. }
  32. if(j==rightLen&&i<leftLen){
  33. arr[left+i+j]=leftsubArr[i];
  34. i++;
  35. }
  36. }
  37. }
  38. void mergeSort(int left,int right,int *arr){
  39. if(left<right){
  40. int mid=(left+right)/2;
  41. mergeSort(left,mid,arr);
  42. mergeSort(mid+1,right,arr);
  43. mergeArr(left,mid,right,arr);
  44. }
  45. }
  46. #endif
    
  1. int main(){
  2. int arr[11]={9,5,10,5,4,12,7,3,2,1,6};
  3. mergeSort(0,10,arr);
  4. for(int i=0;i<11; i++){
  5. std::cout<<arr[i]<<std::endl;
  6. }
  7. }














归并排序

标签:

原文地址:http://www.cnblogs.com/yml435/p/4655545.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!