归并排序

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

分治算法的步步骤:

归并排序的步骤:




第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. }














posted @ 2015-07-17 19:48  yml435  阅读(154)  评论(0编辑  收藏  举报