归并排序

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



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



171947344548829.png原代码:

   
  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
171947344548829.png测试代码:
    

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














转载于:https://www.cnblogs.com/yml435/p/4655545.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值