归并排序 的递归算法


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,实现排序。

 
时间: 2024-10-20 08:38:54

归并排序 的递归算法的相关文章

归并排序的递归算法与非递归

昨天晚上搞了好久,总有那么几个数据有点错误,原来数组是从1开始存的,没看清楚... 1 /* 2 请设计归并排序算法函数void mergeSort(int a[],int n),对a[1]..a[n]进行升序排序. 3 并测试在不同数据规模下的排序效率. 4 */ 5 #include "Arrayio.h" 6 #define N 10000 /*N为数据量大小,因data1.txt中只有50万个数,所以自行设定N值时需让N<=500000*/ 7 8 /*请将本函数补充完整

排序1-4、归并排序

    归并排序的递归算法: 原文地址:https://www.cnblogs.com/maider/p/11356521.html

计数排序及其扩展思路

(1)原理和代码以及时间复杂度分析 1.计数排序的原理:设被排序的数组为A,排序后存储到B,C为临时数组.所谓计数,首先是通过一个数组C[i]计算大小等于i的元素个数,此过程只需要一次循环遍历就可以:在此基础上,计算小于或者等于i的元素个数,也是一重循环就完成.下一步是关键:逆序循环,从length[A]到1,将A[i]放到B中第C[A[i]]个位置上.原理是:C[A[i]]表示小于等于a[i]的元素个数,正好是A[i]排序后应该在的位置.而且从length[A]到1逆序循环,可以保证相同元素间

排序算法(简)

排序技术有很多种,下面简单介绍一下几种. 一  插入排序 1.1  直接插入排序 基本思想:每次将一个待排序额记录按其关键码的大小插入到一个已经排好序的有序序列中,直到全部记录排好序. 图解: 代码实现: [cpp] view plaincopy //直接顺序排序 void InsertSort(int r[], int n) { for (int i=2; i<n; i++) { r[0]=r[i];                        //设置哨兵 for (int j=i-1; 

八大排序算法实战:思想与实现

摘要: 所谓排序,就是根据排序码的递增或者递减顺序把数据元素依次排列起来,使一组任意排列的元素变为一组按其排序码线性有序的元素.本文将介绍八种最为经典常用的内部排序算法的基本思想与实现,包括插入排序(直接插入排序,希尔排序).选择排序(直接选择排序,堆排序).交换排序(冒泡排序,快速排序).归并排序.分配排序(基数排序),并给出各种算法的时间复杂度.空间复杂度和稳定性. 版权声明: 本文原创作者:书呆子Rico  作者博客地址:http://blog.csdn.net/justloveyou_/

递归算法(归并排序)

归并排序实现原理:把一系列排好序的子序列合并成一个大的完整有序序列.在递归算法中归并排序算是一个比较典型的例子了,下面是使用javascript实现的归并排序算法: <!DOCTYPE html> <html> <head> <title></title> </head> <body> <script> var merge = function (unsorted, first, mid, last, sort

归并排序的非递归算法

#include<iostream>   #include<stdio.h> #include<stdlib.h> using namespace std; //智二 //交换数组中两个元素的位置 void swap(int left, int right, int sort[]){ int temp; temp = sort[left]; sort[left] = sort[right]; sort[right] = temp; } //两个已经排好序的小数组整合成较

归并排序 的非递归算法

算法思想: 先假设length=1; 表示先将相邻的2个元素进行排序.A[0]与A[1],A[2]与A[3].............A[N-2]与A[N-1](N为偶数 假设) 然后length=2:A[0]A[1]是有序序列,与A[2]A[3] 进行2个有序序列的归并. 依次类推. void Merge_Pass(ElementType A[],ElementType Temp[],int N,int length) { int i,j; for(i=0;i<N-2*length;i+=2*

排序算法——二路归并排序

二路归并排序主要运用了"分治算法",分治算法就是将一个大的问题划分为n个规模较小而结构相似的子问题. 这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了"大"问题的解. 二路归并排序主旨是"分解"与"归并". 下面是参考<高性能JavaScript>中的代码: function merge(left, right) { var result = []; while(left.leng