• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            依次的排序算法為 :insertsort,shellsort,mergersort,quicksort,heapsort, countingsort,radixsort,bucketsort.

            依照《算法導(dǎo)論》偽代碼實(shí)現(xiàn)。
            #include "randomizer.h"
            #include 
            "insertsort.h"
            #include 
            "heapsort.h"
            #include 
            "mergersort.h"
            #include 
            "shellsort.h"
            #include 
            "quicksort.h"
            #include 
            "countingsort.h"
            #include 
            "radixsort.h"
            #include 
            "bucketsort.h"
            #include 
            "CTimer.h"

            #include
            <iostream>
            #include
            <fstream>
            #include
            <cmath>

            typedef unsigned 
            int *  IntArrayPtr;

            using namespace std;

            int main()
            {        
                IntArrayPtr unsortA,unsortB;    
                
            void (*pSort[])(unsigned int *,long,long)=
                
            {&insertsort,&shellsort,&mergersort,&quicksort,
                
            &heapsort,&countingsort,&radixsort,&bucketsort}
            ;//8種排序算法
                
                unsigned 
            long LEN[5]={pow(2,4), pow(2,8),pow(2,12),pow(2,16),pow(2,20)};//5種問題規(guī)模
                long double counter[5][8];//運(yùn)行時間記錄
                int i=0,j=0;
                
            long k=0;
                CTimer time;
            //計時器
                ofstream data;//文件寫入
                
                data.open(
            "data.txt");
                
            if (data.fail())
                
            {
                    cout
            <<"文件打開失敗"<<endl;
                    exit(
            1);
                }

                
                
            //*****由5種問題規(guī)模(i)和8種排序方法(j)進(jìn)行雙重循環(huán)*****//
                for(i=0; i<5 ;i++)
                
            {            
                    unsortA
            =new unsigned int[LEN[i]];
                    random(unsortA, LEN[i]);
            //產(chǎn)生隨機(jī)亂序數(shù)組
                    
                    
            //*****將未排序數(shù)組寫入文件*****//
                    if(i<2)//數(shù)據(jù)量太大,故只寫入pow(2,4), pow(2,8)規(guī)模下的數(shù)據(jù)
                    {
                        data
            <<""<<i+1<<"組未排序的數(shù)據(jù):"<<endl;
                        
            for(k=0; k<LEN[i] ; k++)
                            data
            <<"unsortA["<<k<<"]:"<<unsortA[k]<<endl;
                        data
            <<endl;
                    }

                    
                    
            for(j=0; j<8; j++)
                    
            {    
                        unsortB
            =new unsigned int[LEN[i]];    
                        
            for(k=0; k<LEN[i]; k++)//復(fù)制亂序數(shù)組unsortA
                            unsortB[k]=unsortA[k];
                        
                        time.Start();
            //計數(shù)開始
                        if (j==2||j==3)//mergersort或者quicksort調(diào)用LEN[i]-1
                            pSort[j](unsortB,0,LEN[i]-1);//調(diào)用排序算法
                        else
                            pSort[j](unsortB,
            0,LEN[i]);//調(diào)用排序算法
                        counter[i][j]=time.End();//計數(shù)結(jié)束
                        
                        cout
            <<"runningtime:"<<counter[i][j]<<"ms"<<endl;
                        
                        
            //*****將排好序的數(shù)據(jù)寫入文件*****//
                        if(i<2)//數(shù)據(jù)量太大,故只寫入pow(2,4), pow(2,8)規(guī)模下的數(shù)據(jù)
                        {
                            data
            <<""<<i+1<<"組已排好序的數(shù)據(jù):經(jīng)過第"<<j+1<<"種排序法"<<endl;
                            
            for(k=0; k<LEN[i] ; k++)
                                data
            <<"unsortB["<<k<<"]:"<<unsortB[k]<<endl;
                            data
            <<endl;
                        }

                        
                        delete [] unsortB;            
                    }

                    cout
            <<endl;
                    delete [] unsortA;
                }

                
                
                
            //*****將運(yùn)行時間數(shù)據(jù)寫入文件*****//
                data<<endl<<"依次的排序算法為:insertsort,shellsort,mergersort,quicksort,heapsort,countingsort,radixsort,bucketsort."<<endl;
                
            for(i=0; i<5; i++)
                    
            for(j=0; j<8; j++)
                        data
            <<""<<i<<"組運(yùn)行時間:"<<counter[i][j]<<endl;
                    data
            <<endl;
                    
                    
            return 0;
            }





             1#ifndef RANDOMIZER_H
             2#define RANDOMIZER_H
             3
             4#define MAXNUM 65536
             5
             6#include<iostream>
             7#include<time.h>
             8using namespace std;
             9
            10
            11void random(unsigned int unsort[],long len)
            12{
            13    srand((unsigned) time(NULL));
            14    for(long i=0; i<len; i++)
            15        unsort[i] =2*rand()%MAXNUM;//產(chǎn)生0 ~ 2的16次方之間的隨機(jī)數(shù),
            16    //正好是unsigned int型的取值范圍
            17}

            18
            19
            20
            21#endif//RANDOMIZER_H


             1#ifndef CTIMER_H
             2#define CTIMER_H
             3
             4#include "Windows.h"
             5
             6class   CTimer   
             7{   
             8public:   
             9    CTimer() 
            10    {
            11        QueryPerformanceFrequency(&m_Frequency);//取CPU頻率
            12    }
               
            13    void Start()
            14    {
            15        QueryPerformanceCounter(&m_StartCount);//開始計數(shù)
            16    }
               
            17    double End() 
            18    {
            19        LARGE_INTEGER   CurrentCount;
            20        QueryPerformanceCounter(&CurrentCount);//終止計數(shù)
            21        return 
            22            double(CurrentCount.LowPart-m_StartCount.LowPart)/(double)m_Frequency.LowPart*1000;
            23    
            24    }
               
            25private:   
            26    LARGE_INTEGER   m_Frequency;   
            27    LARGE_INTEGER   m_StartCount;   
            28}
            ;
            29
            30#endif//CTIMER_H   


             1#ifndef INSERTSORT_H
             2#define INSERTSORT_H
             3
             4
             5#include<iostream>
             6using namespace std;
             7
             8
             9/*
            10void insertsort(unsigned int A[],long,long len)
            11{
            12    for(long j=1; j<len ;j++)
            13    {
            14        unsigned int key=A[j];
            15        long i=j-1;
            16        while (i>=0 && A[i]>key)
            17        {
            18            A[i+1]=A[i];
            19            i--;
            20        }
            21        A[i+1]=key;
            22    }
            23}
            24*/

            25
            26
            27/***這段代碼對一個整型數(shù)組進(jìn)行升序排序,可以看出每個元素插入到隊列中經(jīng)過兩個步驟:
            28     一是挨個比較,找到自己所在的位置,而是把后面的數(shù)據(jù)全部移位,然后把元素插入。
            29要把數(shù)據(jù)插入,移位是必不可少了.因為要插入的隊列已經(jīng)是排序好的,我們可以使用二分法
            30來減少比較的次數(shù)。二分法的時間復(fù)雜度為O(log 2 n),而線性查找的復(fù)雜度為O(n)。
            31改進(jìn)后的代碼如下:***/

            32
            33int compare(unsigned int a,unsigned int b)
            34{
            35    return a<b?-1:a==b?0:1;
            36}

            37
            38int binsearch(unsigned int A[], unsigned int key,long p, long r)//二分查找
            39{
            40    long middle;
            41    while (p <= r)
            42    {
            43        middle = (p + r) / 2;
            44<img id=Codehighlighter1_730_833_Open_Image onclick="this.style.display='none'; Codehighlighter1_730_833_Open_Text.style.display='none'; C%2
            posted on 2006-11-04 11:48 哈哈 閱讀(1140) 評論(3)  編輯 收藏 引用

            評論:
            # re: 各種排序算法實(shí)現(xiàn)源代碼 2006-11-09 23:40 | my
            似乎歸并排序有錯誤,不知道您調(diào)試過沒有,結(jié)果正確否?  回復(fù)  更多評論
              
            # 不好意思,是我自己的程序錯了 2006-11-10 07:48 | my
            不好意思啊,昨天晚上留言說您的算法有問題,今天早上再看了下,是我的程序有問題,實(shí)在是不好 意思啊,呵呵,共同學(xué)習(xí)啊,我也在看算法導(dǎo)論,不過才開始看到第二章  回復(fù)  更多評論
              
            # re: 各種排序算法實(shí)現(xiàn)源代碼 2006-11-10 09:43 | pengkuny
            @my
            沒關(guān)系啊.共同學(xué)習(xí).
            程序我都調(diào)試過了,運(yùn)行良好,只是在問題規(guī)模為2^20的時候,你需要等上20分種左右,insertsort才能結(jié)束.  回復(fù)  更多評論
              

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品久久久天天影视| 久久www免费人成看片| 久久人人爽人人爽人人爽| 日产久久强奸免费的看| 国内精品久久久久久久久电影网| 奇米影视7777久久精品| 国产精品亚洲综合专区片高清久久久| 很黄很污的网站久久mimi色| 漂亮人妻被中出中文字幕久久 | 中文字幕久久波多野结衣av| 精品久久久久久无码中文野结衣 | 日本五月天婷久久网站| 久久久精品免费国产四虎| 久久亚洲欧美日本精品| 久久精品国产一区二区三区日韩| 久久久久亚洲AV成人网人人网站| 青草国产精品久久久久久| 一本久久a久久精品综合夜夜 | 亚洲精品乱码久久久久久自慰| 日本福利片国产午夜久久| 亚洲AⅤ优女AV综合久久久| 99国产欧美久久久精品蜜芽| 一级做a爰片久久毛片毛片| 亚洲伊人久久综合影院| 99国产精品久久久久久久成人热| 久久精品视频一| 久久久噜噜噜久久中文字幕色伊伊| 久久福利青草精品资源站免费| 久久天天婷婷五月俺也去| 久久av高潮av无码av喷吹| 亚洲国产精品久久久久| 精品久久久久久亚洲精品| 久久国产热精品波多野结衣AV| 中文字幕久久精品无码| 亚洲国产成人精品久久久国产成人一区二区三区综 | 国产精品99久久精品| 一本久久精品一区二区| 久久国产视屏| 日韩AV毛片精品久久久| 久久久中文字幕日本| 久久精品三级视频|