• 归并排序 的递归算法




    void
    Merge(ElementType A[],ElementType Temp[],int Left,int Right,int RightEnd) { int temp,i, LeftEnd,count; LeftEnd=Right-1;// 超级错误 count=RightEnd-Left+1; temp=Left; while(Left<=LeftEnd&& Right<=RightEnd)//超级错误 { if(A[Left]<=A[Right]) Temp[temp++]=A[Left++]; else Temp[temp++]=A[Right++]; } while(Left<=LeftEnd) Temp[temp++]=A[Left++]; while(Right<=RightEnd) Temp[temp++]=A[Right++]; for ( i = 0; i < count; i++,RightEnd--) A[RightEnd]=Temp[RightEnd];//超级错误 } void (ElementType A[],ElementType Temp[],int Left,int RightEnd) { int center; if(Left<RightEnd) { center=(Left+RightEnd)/2; Msort(A,Temp,Left,center); Msort(A,Temp,center+1,RightEnd); Merge(A,Temp,Left,center+1,RightEnd); } } void M_sort( ElementType A[], int N ) { /* 归并排序 */ ElementType *TmpA; TmpA = (ElementType *)malloc(N*sizeof(ElementType)); if ( TmpA != NULL ) { Msort( A, TmpA, 0, N-1 ); free( TmpA ); } else printf( "空间不足" ); }



    
    
    错误分析: 1.将LeftEnd=RightEnd-1; 没有想清楚leftend  与right 是相连的。
    2.Left<=LeftEnd 错误写成<, 极限情况,只有2个元素的时候,left=0,leftend=0,right=1,right=1;
    3.A[RightEnd]=Temp[RightEnd];错误的写成.Temp[RightEnd]=A[RightEnd];
    算法分析:
    merge 实现2个有序序列的归并。
    left 表示第一个有序序列的起始位置,leftend 表示第一个有序序列最后一个元素的下标,right表示第二个有序序列的起始下标,默认leftend与right相邻。
    rightend表示第二个序列的最后元素的下标。 temp数组临时存放排序的序列。
    当A[Left]<=A[Right],说明左边序列第一个元素小于右边第一个元素,将左边序列第一个元素放入temp。同时left++,temp++,,继续比较A[Left]<=A[Right]。
    当A[Left]>A[Right],反之。
    当有一个序列全部放入temp中时,将另一个序列直接复制到temp中。

    Msort 递归实现排序。
    center将序列分成2组。
    递归对两组进行Msort,调用merge,实现排序。


     
  • 相关阅读:
    jquery清空下拉框,保留第一个
    [转]js和jquery获取窗体高度
    点击回车 按钮不执行点击事件
    时间戳 Date.parse()和dateObject.getTime()的区别
    uni-app 时间格式问题 new Date(str) IOS系统跟Android系统不兼容
    uni-app 使用 iconfont 图标 自定义图标
    uni-app 使用Vuex+ (强制)登录
    uni-app 保持登录状态 (Vuex)
    package.json和npm install、cnpm install 的問題
    如何将baseUrl项目地址提取放到放到static
  • 原文地址:https://www.cnblogs.com/zle1992/p/5860254.html
Copyright © 2020-2023  润新知