首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于快速排序的有关问题

2012-03-16 
关于快速排序的问题大家帮忙看一下这两个快速排序,为什么对100000或1000000个数排序时,测试时间会相差这么

关于快速排序的问题
大家帮忙看一下这两个快速排序,为什么对100000或1000000个数排序时,测试时间会相差这么多,不知道哪里导致这种结果!

首先是比较快的一个程序
#include   <iostream>  
#include   <fstream>  
#include   "stdlib.h "  
#include   <ctime>  
#include <vector>
 
using   namespace   std;  
 
template   <class   T>  
long   Partition(T   *data,   long*   link,   long   low,   long   high,   bool  

ascend)  
{  
    long   i,j,k;  
    long   thresindex;  
    bool   tmpbool;  
    thresindex=link[low];  
    i=low;  
    j=high;  
    while(i <j)  
    {  
        do   {  
            i++;  
            if(i> high-1)   break;  
            if(ascend)  
                tmpbool=data[link[i]] <data[thresindex];  
            else   tmpbool=data[link[i]]> data[thresindex];  
        }   while(tmpbool);  
        if(i> high-1)   {   j=high-1;   break;   }  
 
        do   {  
            j--;  
            if(j <low+1)   break;  
            if(ascend)  
                tmpbool=data[link[j]]> data[thresindex];  
            else   tmpbool=data[link[j]] <data[thresindex];  
        }   while(tmpbool);  
        if(j <low+1)   {   j=low;   break;   }  
 
        if(i <j)   {  
            k=link[i];  
            link[i]=link[j];  
            link[j]=k;  
        }  
    }  
    link[low]=link[j];  
    link[j]=thresindex;  
    return   j;  
}  
 
template   <class   T>  
void   QuickSort(T*   data,   long*   link,   long   low,   long   high,   bool  

ascend)  
{  
    long   mid=0;  
    if(low <high)  
    {  
        mid=high+1;  
        mid=Partition(data,link,low,mid,ascend);  
        QuickSort(data,link,low,mid-1,ascend);  
        QuickSort(data,link,mid+1,high,ascend);  
    }  
}  

/***************测试************************************/
void   main()  
{  
    long   DATANUM=100000;  
    long   *data;  
    long   *link;  
    long   i;  


    cout < < "Please   input   the   total   number   of   random-generated  

digits(default   100000): ";  
    cin> > DATANUM;  
    if(DATANUM <1)   DATANUM=100000;  
 
    data=(long   *)malloc(DATANUM*sizeof(long));  
    link=(long   *)malloc(DATANUM*sizeof(long));  
 
    /*   Create   random   numbers   &   initial   the   index   in   array   "link "   */  
srand((unsigned)(time(NULL)));  
    for(i=0;i <DATANUM;i++)  
    {  
        data[i]=(rand()*10000+rand())%(DATANUM*2);  
        link[i]=i;  
    }  
    cout < <endl;  
 
    /*   Sort!   Then   show   how   long   of   the   sorting   procedure!   */  
    double   start,end;  
    double     duration;  
    start=clock();  
    QuickSort(&data[0],&link[0],0,DATANUM-1,1);  
    end=clock();  
    duration   =   (double)(end-start);  
    cout < < "Time   elapsed   =   " < <duration < < "   ms!\n ";  
}


下面这个就比较慢了:
/************** "qsort.h "****************************/

#include <iostream>
#include <vector>
using   namespace   std;

template <class   T>
void   QuickSort(vector <T> &Array,int   low,int   high)
{
int   Part;
if(high> low)
{
Part   =   Partition(Array,low,high);
QuickSort(Array,low,Part-1);
QuickSort(Array,Part+1,high);
}
}

template <class   T>
int   Partition(vector <T> &Array,int   low,int   high)
{
T   temp   =   Array[low];
while(low   <   high)
{
while((low <high)&&(Array[high]   > =   temp))
high--;
Array[low]   =   Array[high];
while((low <high)&&(Array[low]   <=   temp))
low++;
Array[high]   =   Array[low];
}
Array[low]   =   temp;
return   low;
}


#include "qsort.h "
#include   <time.h>
void   main()
{

    vector <int>   Heap;
vector <int>   Quick;
vector <int>   Merge;
double   Tstart;
double   Tend;
double   duration;

srand((unsigned)(time(NULL)));
int   DATANUM   =   100000;//排序个数
for(int   i=0;i <DATANUM;i++)  
{  
Quick.push_back((rand()*10000+rand())%(DATANUM*2));  
}  
Tstart   =   clock();

QuickSort(Quick,1,Quick.size()-1);

Tend   =   clock();
duration   =   double(Tend-Tstart);
for(i   =   1;i <Quick.size();i++)
{
cout < <Quick[i] < < "   ";
}
cout < <endl;

cout < < "Quick   Time: " < <duration < < "ms " < <endl;


cout < < "END " < <endl < <endl < <endl < <endl;

}


[解决办法]
我做测试了, 但将后一个算法 的 vector 改成了 long[], 然后时间从 1500ms 级别变成了100 ms

热点排行