zoukankan      html  css  js  c++  java
  • 归并排序

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

    分治算法的步步骤:

    归并排序的步骤:




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














  • 相关阅读:
    Editor HYSBZ
    MooFest POJ
    Monkey King HDU
    Haruna’s Breakfast HYSBZ
    数颜色 HYSBZ
    Mato的文件管理 HYSBZ
    小Z的袜子(hose) HYSBZ
    javascript类的简单定义
    json格式
    javascript call apply
  • 原文地址:https://www.cnblogs.com/yml435/p/4655545.html
Copyright © 2011-2022 走看看