归并排序的非递归实现

原创 2013年12月05日 14:53:42

merge.h

#ifndef MERGE_H_INCLUDED
#define MERGE_H_INCLUDED
 
#define  MAXSIZE  1000
typedef struct
{
    int  R[MAXSIZE];
    int  length;
} sqlist;
typedef  sqlist  *Sqlist;
 
void  mergepass(int SR[],int TR[],int s,int n);
void  mergesort(Sqlist  L);
void  Merge(int s[],int t[],int i,int j,int k); /**< 合并函数 */
 
#endif // MERGE_H_INCLUDED

merge.c

#include  <stdio.h>
#include  <malloc.h>
#include  "merge.h"
 
void  mergesort(Sqlist  L)
{
    int  *TR=(int*)malloc((L->length+1) * sizeof(int));
 
    int k=1;
 
    while(k<L->length)
    {
        mergepass(L->R,TR,k,L->length );
        k=2*k;
        mergepass(TR,L->R,k,L->length );
        k=2*k;
    }
}
 
 
void  mergepass(int SR[],int TR[],int s,int n)
{
    int  i=1;
    int j;
 
    while(i < n-2*s+1)
    {
        Merge(SR,TR,i,i+s-1,i+2*s-1);  //i的增长速度为s*2
        i=i+2*s;
 
    }
 
    if(i < n-s+1)
        Merge(SR,TR,i,i+s-1,n);
    else
        for(j=i;j <=n; j++)      //J初值为i,需注意,不可写为1.
           TR[j]=SR[j];
}
 
void  Merge(int  SR[],int TR[],int i,int m,int n)
{
    int  j,k,l;
 
    for(j=m+1,k=i;i<=m && j<=n; k++)/**< 判断语句如为 k<=m && j<=n; 将会出错,中间两个数值将无法归并 */
    {
        if(SR[i] <=SR[j])
            TR[k]=SR[i++];
         else
            TR[k]=SR[j++];
    }
 
    if(i <=m)
    {
        for( ;i<=m;)
            TR[k++]=SR[i++];
    }
 
 
    if(j<=n)
    {
        for( ;j<=n;)
            TR[k++]=SR[j++];
    }
 
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include  "merge.c"
 
int main()
{
    int  i;
    int  d[10]={50,30,21,44,76,52,78,42,88,90};
    Sqlist  L=(Sqlist )malloc(sizeof(sqlist));
 
    L->R[0]=L->length=10;
    for(i=0;i <10;i++)
    {
 
        L->R[i+1]=d[i];
    }
 
   mergesort(  L);
   for(i=1;i <=10;i++)
        printf("%d\t",L->R[i]);
 
     getchar() ;
    return 0;
}


归并排序(递归和非递归方法实现)

/* 归并排序 VS2010 */ #include #include #include #define OK 1 #define ERROR 0 #define MAXSIZE 50 t...
  • andrew_yt
  • andrew_yt
  • 2012年11月12日 17:58
  • 4700

归并排序的非递归算法

归并排序的原理是不断地将两个有序的序列合并为一个有序列,设有n个元素,那么第一步是长度为1的序列进行合并,第二步是长度为2的序列进行合并,第3步是长度为4的序列进行合并,以此类推。算法的时间复杂度是O...
  • NeilHappy
  • NeilHappy
  • 2012年01月07日 14:38
  • 5110

二路归并排序算法(递归&非递归)

归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。 归并排序是建立在归并操作上的...
  • prstaxy
  • prstaxy
  • 2012年11月09日 14:31
  • 17501

归并排序递归及非递归实现(自然合并排序)

一:归并排序 普通的归并排序递归实现比较简单,就不在此赘述,一看就懂。下面贴上代码。 #include using namespace std; template void merge(T ar...
  • FreeeLinux
  • FreeeLinux
  • 2016年09月29日 19:07
  • 2115

【排序】快速排序及其非递归实现,归并排序详解

快速排序  快速排序(Quicksort)是对冒泡排序的一种改进。   我们知道快速排序用的是分治的基本思想:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归的解决这些子问题,然后将这些...
  • lixungogogo
  • lixungogogo
  • 2016年08月08日 19:32
  • 815

归并排序非递归实现C语言

  话说这个东西写到凌晨3点27分,都没有写好.刚才睡醒了写完的.主要遇到的问题就是当数组大小不是2的幂的时候发生的 right_end 越界的时候.我的逻辑起初偏于复杂,后来重新组织逻辑,当发生 r...
  • Golden_Shadow
  • Golden_Shadow
  • 2010年11月21日 13:33
  • 1055

归并排序的递归与非递归实现Java

public static int[] sort(int[] nums, int low, int high) { int mid = (low + high) / 2; ...
  • lll1204019292
  • lll1204019292
  • 2016年08月28日 16:20
  • 450

排序算法之2路归并排序(递归和非递归)

归并排序,从字面意思上理解,即合并的时候排序。 归并排序是分治法的一种,首先将待排数列分成1个一个元素,然后依次按大小合并。 排序过程 分 初始关键值  [49]  [38]  [65] ...
  • fanfan199312
  • fanfan199312
  • 2015年08月19日 17:56
  • 333

归并排序 递归版和非递归版的实现(java)

基于最近笔试遇到听多次 归并排序,今天做了如下总结(有递归版和非递归版的) 实现思路:将待排序的序列分为若干个,每次两两合并,然后再把有序子序列合并为整体有序序列。 递归排序合并的思路 1)初始化...
  • gdutxiaoxu
  • gdutxiaoxu
  • 2016年05月01日 22:57
  • 1639

归并排序详解——思路分析以及核心代码(java)实现...非递归实现

归并排序的java实现。 归并排序非递归实现。 最优美的归并排序实现。
  • QwQ________
  • QwQ________
  • 2016年04月25日 13:17
  • 805
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:归并排序的非递归实现
举报原因:
原因补充:

(最多只允许输入30个字)