posts - 1,comments - 6,trackbacks - 0
修改后的测试结果:(可是修改之后随机数排序时间的差距还是很大?请指点)


修改后的程序下载:
/Files/youyu/qSort.rar

修改后的程序代码:
#include <stdio.h>
#include 
<stdlib.h>
#include 
<time.h>

#define N 50000 //定义排序数组的个数
#define N2 5000

int partition(int [],int,int);//快速排序分开数组的函数声明
void qSort(int [],int,int);//快速排序函数声明

void merge(int [],int,int,int);//归并排序数组合并函数声明
void mergesort(int [],int,int);//归并排序数组排序函数声明

//主函数
void main()
{
    
int i,a[N],a1[N],b[N2],b1[N2];//(已修改)增加了两个用来存储临时数据的数组
    double t1,t2,t3,t4;
        
    
for(i=0;i<N;i++)
    
{
        a[i]
=rand()%N;//使用随机数作为参数
        a1[i]=rand()%N;//(修改)*****************************
    }

    
for(i=0;i<N2;i++)
    
{
        b[i]
=i;//使用已经排好序的一组数作为参数
        b1[i]=i;
    }

    
    
//快速排序N个随机数字所用的时间
    t1=clock();
    qSort(a,
0,N-1);
    t1
=clock()-t1;

    
//归并排序N个随机数字所用的时间
    t2=clock();
    mergesort(a1,
0,N-1);//(修改)*****************************
    t2=clock()-t2;

    
//快速排序N2个已经排序的数字所用的时间
    t3=clock();
    qSort(b,
0,N2-1);
    t3
=clock()-t3;

    
//归并排序N2个已经排序的数字所用的时间
    t4=clock();
    mergesort(b1,
0,N2-1);//(修改)*****************************
    t4=clock()-t4;

    printf(
"\n快速排序%d个随机数字所用时间为:%f毫秒\n",N,(double)t1);
    printf(
"\n归并排序%d个随机数字所用时间为:%f毫秒\n",N,(double)t2);
    printf(
"\n快速排序%d个已经排序数字所用时间为:%f毫秒\n",N2,(double)t3);
    printf(
"\n归并排序%d个已经排序数字所用时间为:%f毫秒\n\n",N2,(double)t4);
}


//快速排序
//快速排序分开数组函数的具体实现
int partition(int a[],int low,int high)
{
    
int pivotkey=a[low];
    
while(low<high)
    
{
        
while(low<high && a[high]>=pivotkey)
        
{
            high
--;
        }

        a[low]
=a[high];
        
while(low<high && a[low]<=pivotkey)
        
{
            low
++;
        }

        a[high]
=a[low];
    }

    a[low]
=pivotkey;
    
return low;
}


//快速排序函数的具体实现
void qSort(int a[],int left,int right)
{
    
if(left<right)
    
{
        
int key=partition(a,left,right);
        qSort(a,left,key
-1);
        qSort(a,key
+1,right);
    }

}


//归并排序
//归并排序合并数组函数的具体实现
void merge(int a[],int low,int middle,int high)
{
    
int h,i,j,k;
    
int b[N];
    h
=low;
    i
=low;
    j
=middle+1;

    
while(h<=middle&&j<=high)
    
{
        
if(a[h]<=a[j])
        
{
            b[i]
=a[h];
            h
++;
        }

        
else
        

            b[i]
=a[j];
            j
++;
        }

        i
++;
    }

    
if(h>middle)
    
for(k=j;k<=high;k++)
    
{
        b[i]
=a[k];
        i
++
    }

    
else
    
{
        
for(k=h;k<=middle;k++)
        

            b[i]
=a[k];
            i
++;
        }

    }

    
for(k=low;k<=high;k++)
    
{
        a[k]
=b[k];
    }

}


//归并排序函数的具体实现
void mergesort(int a[],int low,int high)
{
    
int middle;
    
if(low<high)
    
{
        middle
=(low+high)/2;
        mergesort(a,low,middle);
        mergesort(a,middle
+1,high);
        merge(a,low,middle,high);
    }

}

posted on 2007-05-06 00:35 鱿鱼 阅读(3402) 评论(6)  编辑 收藏 引用

FeedBack:
# re: 快速排序与归并排序的比较(C语言)
2007-05-06 01:03 | billjeff
Qsort和Merge Sort对于random序列平均差距没那么大  回复  更多评论
  
# re: 快速排序与归并排序的比较(C语言)
2007-05-06 01:32 | 鱿鱼
@billjeff
但这个结果是我机子上出来的,是程序哪里有问题吗?  回复  更多评论
  
# re: 快速排序与归并排序的比较(C语言)
2007-05-06 13:11 | 鱿鱼
修改之后好像随机数的排序时间差还是很大啊  回复  更多评论
  
# re: 快速排序与归并排序的比较(C语言)
2007-05-06 13:34 | Santa
@鱿鱼
我觉得算法没问题,不过你在使用随机数之前要randomize一下
srand(time()) (C++里这样写,C里应该也是这样把),不然生成的随机数列性质会很不好,有可能就是两个跳变的数字。  回复  更多评论
  
# re: 快速排序与归并排序的比较(C语言)[未登录]
2009-12-05 15:55 | yang
你的算法有没有问题我不知道
但是结果很有问题:
1.“Qsort和Merge Sort对于random序列平均差距没那么大”
两者基本都是Θ(n lg n)。
而快排最理想Θ(n lg n),最差情况Θ(n2)。

2.归并排序在各种情况下的时间代价都是Θ(n lg n)。
从你的结果看来,随机和有序竟然差了10倍,显然是有问题的。  回复  更多评论
  
# re: 快速排序与归并排序的比较(C语言)
2010-05-07 14:40 | Curie
快拍部分,交换 a[high]=a[low]等,不对吧  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理