• <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>
            aurain
            技術(shù)文摘
            posts - 137,  comments - 268,  trackbacks - 0

            排序算法是數(shù)據(jù)結(jié)構(gòu)學(xué)科經(jīng)典的內(nèi)容,其中內(nèi)部排序現(xiàn)有的算法有很多種,究竟各有什么特點(diǎn)呢?本文力圖設(shè)計(jì)實(shí)現(xiàn)常用內(nèi)部排序算法并進(jìn)行比較。分別為起泡排序,直接插入排序,簡(jiǎn)單選擇排序,快速排序,堆排序,針對(duì)關(guān)鍵字的比較次數(shù)和移動(dòng)次數(shù)進(jìn)行測(cè)試比較.

            問(wèn)題分析和總體設(shè)計(jì)

            ADT OrderableList{
            數(shù)據(jù)對(duì)象:D={ai| ai∈IntegerSet,i=1,2,…,n,n≥0}
            數(shù)據(jù)關(guān)系:R1={〈ai-1,ai〉|ai-1, ai∈D, i=1,2,…,n}
            基本操作:
            InitList(n)
            操作結(jié)果:構(gòu)造一個(gè)長(zhǎng)度為n,元素值依次為1,2,…,n的有序表。
            Randomizel(d,isInverseOrser)
            操作結(jié)果:隨機(jī)打亂
            BubbleSort( )
            操作結(jié)果:進(jìn)行起泡排序
            InserSort( )
            操作結(jié)果:進(jìn)行插入排序
            SelectSort( )
            操作結(jié)果:進(jìn)行選擇排序
            QuickSort( )
            操作結(jié)果:進(jìn)行快速排序
            HeapSort( )
            操作結(jié)果:進(jìn)行堆排序
            ListTraverse(visit( ))
            操作結(jié)果:依次對(duì)L種的每個(gè)元素調(diào)用函數(shù)visit( )
            }ADT OrderableList

            待排序表的元素的關(guān)鍵字為整數(shù).用正序,逆序和不同亂序程度的不同數(shù)據(jù)做測(cè)試比較,
            對(duì)關(guān)鍵字的比較次數(shù)和移動(dòng)次數(shù)(關(guān)鍵字交換計(jì)為3次移動(dòng))進(jìn)行測(cè)試比較.
            要求顯示提示信息,用戶(hù)由鍵盤(pán)輸入待排序表的表長(zhǎng)(100-1000)和不同測(cè)試數(shù)據(jù)的組數(shù)(8-18).每次測(cè)試完畢,要求列表現(xiàn)是比較結(jié)果.
            要求對(duì)結(jié)果進(jìn)行分析.

            詳細(xì)設(shè)計(jì)
            1、起泡排序
            算法:核心思想是掃描數(shù)據(jù)清單,尋找出現(xiàn)亂序的兩個(gè)相鄰的項(xiàng)目。當(dāng)找到這兩個(gè)項(xiàng)目后,交換項(xiàng)目的位置然后繼續(xù)掃描。重復(fù)上面的操作直到所有的項(xiàng)目都按順序排好

            bubblesort(struct rec r[],int n)
            {
            int i,j;
            struct rec w;
            unsigned long int compare=0,move=0;
            for(i=1;i<=n-1;i++)
            for(j=n;j>=i+1;j--)
            {
            if(r[j].key<r[j-1].key)
            {
            w=r[j];
            r[j]=r[j-1];
            r[j-1]=w;
            move=move+3;
            }
            compare++;
            }
            printf("
            BubbleSort compare= %ld,move= %ld
            ",compare,move);
            }


            2、直接插入排序
            算法:經(jīng)過(guò)i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當(dāng)位置,使得L[1..i]又是排好序的序列。要達(dá)到這個(gè)目的,我們可以用順序比較的方法。首先比較L[i]和L[i-1],如果L[i-1]≤ L[i],則L[1..i]已排好序,第i遍處理就結(jié)束了;否則交換L[i]與L[i-1]的位置,繼續(xù)比較L[i-1]和L[i-2],直到找到某一個(gè)位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時(shí)為止

            insertsort(struct rec r[],int n)
            {
            int i,j;
            unsigned long int compare=0,move=0;
            for(i=2;i<=n;i++)
            {compare++;
            r[0]=r[i];
            move++;
            j=i-1;
            while(r[0].key {r[j+1]=r[j];
            j--;
            move++;
            ++compare;}
            r[j+1]=r[0];
            move++;
            }
            printf("
            InsertSort compare= %ld,move= %ld
            ",compare,move);
            }


            3、簡(jiǎn)單選擇排序
            算法:首先找到數(shù)據(jù)清單中的最小的數(shù)據(jù),然后將這個(gè)數(shù)據(jù)同第一個(gè)數(shù)據(jù)交換位置;接下來(lái)找第二小的數(shù)據(jù),再將其同第二個(gè)數(shù)據(jù)交換位置,以此類(lèi)推。

            selectsort(struct rec r[],int n)
            {
            unsigned long int compare=0,move=0;
            int i,j,k;
            struct rec w;
            for(i=1;i<=n-1;i++)
            { k=i;
            for(j=i+1;j<=n;j++)

            { if(r[j].key>r[k].key) {k=j; compare++; }
            w=r[i];
            r[i]=r[k];
            r[k]=w;
            move=move+3;

            }
            }
            printf("
            SelectSort compare= %ld,move= %ld
            ",compare,move);
            }


            4、快速排序
            算法:首先檢查數(shù)據(jù)列表中的數(shù)據(jù)數(shù),如果小于兩個(gè),則直接退出程序。如果有超過(guò)兩個(gè)以上的數(shù)據(jù),就選擇一個(gè)分割點(diǎn)將數(shù)據(jù)分成兩個(gè)部分,小于分割點(diǎn)的數(shù)據(jù)放在一組,其余的放在另一組,然后分別對(duì)兩組數(shù)據(jù)排序。
            通常分割點(diǎn)的數(shù)據(jù)是隨機(jī)選取的。這樣無(wú)論你的數(shù)據(jù)是否已被排列過(guò),你所分割成的兩個(gè)字列表的大小是差不多的。而只要兩個(gè)子列表的大小差不多


            q(struct rec r[],int s,int t)
            {
            int i=s,j=t;
            if(s<t)
            {
            r[0]=r[s]; ++a; c++;
            do{
            while(j>i&&r[j].key>=r[0].key)
            {j--;
            ++a; }
            if(i<j)
            { r[i]=r[j];
            i++;
            c++; }
            while(i<j&&r[i].key<=r[0].key)
            {i++;
            ++a; }
            if(i<j)
            { r[j]=r[i];
            j--;
            c++; }
            } while(i<j);
            r[i]=r[0];
            c++;
            q(r,s,j-1);
            q(r,j+1,t);
            }
            }


            5. 堆排序
            (1) 基本思想:
            堆排序是一樹(shù)形選擇排序,在排序過(guò)程中,將R[1..N]看成是一顆完全二叉樹(shù)的順序存儲(chǔ)結(jié)構(gòu),利用完全二叉樹(shù)中雙親結(jié)點(diǎn)和孩子結(jié)點(diǎn)之間的內(nèi)在關(guān)系來(lái)選擇最小的元素。
            (2) . 堆的定義: N個(gè)元素的序列K1,K2,K3,...,Kn.稱(chēng)為堆,當(dāng)且僅當(dāng)該序列滿(mǎn)足特性:
            Ki≤K2i Ki ≤K2i+1(1≤ I≤ [N/2])


            sift(struct rec r[],int l,int m)
            {
            int i,j;
            struct rec w;
            i=l; j=2*i;
            w=r[i];
            while(j<=m)
            {
            if(j<m&&r[j].key<r[j+1].key) { j++;
            }
            if(w.key<r[j].key)
            {
            r[i]=r[j];
            i=j;
            j=2*i;
            }
            else j=m+1;
            }
            r[i]=w;
            }

            heapsort(struct rec r[],int n)
            {
            unsigned long int compare=-1,move=-1;
            struct rec w;
            int i;
            int a;
            for(i=n/2;i>=1;i--) a=sift(r,i,n);
            compare++;
            move++;

            for(i=n;i>=2;i--)
            {
            w=r[i];
            r[i]=r[1];
            r[1]=w;
            a=sift(r,1,i-1);
            compare+=a;
            move+=a;
            }
            }


            小結(jié):
            1.學(xué)會(huì)使用隨機(jī)函數(shù)randomize( ) 為數(shù)組賦初值要在頭文件中添加#include
            2.在做此程序之前基本上是在理解了各種排序過(guò)程以后完成的
            3.對(duì)排序算法的總結(jié):
            (1)若n較小(如n≤50),可采用直接插入或直接選擇排序。
             當(dāng)記錄規(guī)模較小時(shí),直接插入排序較好;否則因?yàn)橹苯舆x擇移動(dòng)的記錄數(shù)少于直接插人,應(yīng)選直接選擇排序?yàn)橐恕?br>(2)若文件初始狀態(tài)基本有序(指正序),則應(yīng)選用直接插人、冒泡或隨機(jī)的快速排序?yàn)橐耍?br>(3)若n較大,則應(yīng)采用時(shí)間復(fù)雜度為O(nlgn)的排序方法:快速排序、堆排序或歸并排序。
             快速排序是目前基于比較的內(nèi)部排序中被認(rèn)為是最好的方法,當(dāng)待排序的關(guān)鍵字是隨機(jī)分布時(shí),快速排序的平均時(shí)間最短;
             堆排序所需的輔助空間少于快速排序,并且不會(huì)出現(xiàn)快速排序可能出現(xiàn)的最壞情況。這兩種排序都是不穩(wěn)定的

            posted on 2008-06-12 11:03 閱讀(3319) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 算法與數(shù)據(jù)結(jié)構(gòu)

            <2008年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            2425262728291
            2345678

            常用鏈接

            留言簿(17)

            隨筆分類(lèi)(138)

            隨筆檔案(137)

            網(wǎng)絡(luò)開(kāi)發(fā)

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 497473
            • 排名 - 36

            最新隨筆

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品久久久久久无码专区 | 成人国内精品久久久久一区| 久久精品国产99久久久| 国产ww久久久久久久久久| 天天综合久久一二三区| 久久精品午夜一区二区福利| 久久免费大片| 国产精品免费福利久久| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久久久久亚洲AV无码专区| 国产伊人久久| 久久不见久久见免费视频7| 亚洲欧美日韩精品久久亚洲区| 久久国产精品99精品国产| 亚洲国产小视频精品久久久三级| 久久综合九色综合欧美狠狠| 香蕉久久av一区二区三区| 日本精品一区二区久久久| 伊人色综合久久天天| 久久久久亚洲av无码专区| 久久婷婷是五月综合色狠狠| 狠狠久久综合伊人不卡| 精品久久无码中文字幕| 亚洲精品白浆高清久久久久久| 日韩十八禁一区二区久久| 久久久久免费视频| 一本一道久久精品综合 | 久久人人爽人人爽人人片AV不| 青青国产成人久久91网| 99久久婷婷国产综合亚洲| 亚洲精品无码久久千人斩| 久久精品视频一| 亚洲国产成人乱码精品女人久久久不卡 | 狠狠色狠狠色综合久久| 欧美国产精品久久高清| 无码任你躁久久久久久| 精品国产乱码久久久久久浪潮| 国内精品伊人久久久久影院对白| 国产精品狼人久久久久影院 | 久久久久高潮综合影院| 亚洲∧v久久久无码精品|