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

            排序算法是數據結構學科經典的內容,其中內部排序現有的算法有很多種,究竟各有什么特點呢?本文力圖設計實現常用內部排序算法并進行比較。分別為起泡排序,直接插入排序,簡單選擇排序,快速排序,堆排序,針對關鍵字的比較次數和移動次數進行測試比較.

            問題分析和總體設計

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

            待排序表的元素的關鍵字為整數.用正序,逆序和不同亂序程度的不同數據做測試比較,
            對關鍵字的比較次數和移動次數(關鍵字交換計為3次移動)進行測試比較.
            要求顯示提示信息,用戶由鍵盤輸入待排序表的表長(100-1000)和不同測試數據的組數(8-18).每次測試完畢,要求列表現是比較結果.
            要求對結果進行分析.

            詳細設計
            1、起泡排序
            算法:核心思想是掃描數據清單,尋找出現亂序的兩個相鄰的項目。當找到這兩個項目后,交換項目的位置然后繼續掃描。重復上面的操作直到所有的項目都按順序排好

            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、直接插入排序
            算法:經過i-1遍處理后,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當位置,使得L[1..i]又是排好序的序列。要達到這個目的,我們可以用順序比較的方法。首先比較L[i]和L[i-1],如果L[i-1]≤ L[i],則L[1..i]已排好序,第i遍處理就結束了;否則交換L[i]與L[i-1]的位置,繼續比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時為止

            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、簡單選擇排序
            算法:首先找到數據清單中的最小的數據,然后將這個數據同第一個數據交換位置;接下來找第二小的數據,再將其同第二個數據交換位置,以此類推。

            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、快速排序
            算法:首先檢查數據列表中的數據數,如果小于兩個,則直接退出程序。如果有超過兩個以上的數據,就選擇一個分割點將數據分成兩個部分,小于分割點的數據放在一組,其余的放在另一組,然后分別對兩組數據排序。
            通常分割點的數據是隨機選取的。這樣無論你的數據是否已被排列過,你所分割成的兩個字列表的大小是差不多的。而只要兩個子列表的大小差不多


            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) 基本思想:
            堆排序是一樹形選擇排序,在排序過程中,將R[1..N]看成是一顆完全二叉樹的順序存儲結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關系來選擇最小的元素。
            (2) . 堆的定義: N個元素的序列K1,K2,K3,...,Kn.稱為堆,當且僅當該序列滿足特性:
            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;
            }
            }


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

            posted on 2008-06-12 11:03 閱讀(3323) 評論(0)  編輯 收藏 引用 所屬分類: 算法與數據結構

            <2008年10月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            常用鏈接

            留言簿(17)

            隨筆分類(138)

            隨筆檔案(137)

            網絡開發

            最新隨筆

            搜索

            •  

            積分與排名

            • 積分 - 498799
            • 排名 - 36

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            国内精品久久久久影院网站 | 久久久久久久波多野结衣高潮| 久久久久国产视频电影| 99久久精品免费看国产一区二区三区| 精品久久久一二三区| 一本色道久久88精品综合| 亚洲国产精品久久久久网站 | AAA级久久久精品无码区| 久久无码AV一区二区三区| 久久国产精品久久国产精品| 影音先锋女人AV鲁色资源网久久| 欧美一区二区精品久久| 久久精品国产亚洲AV香蕉| 中文字幕人妻色偷偷久久| 亚洲中文字幕久久精品无码喷水 | 综合久久精品色| 香蕉99久久国产综合精品宅男自| 久久996热精品xxxx| 香蕉99久久国产综合精品宅男自 | 51久久夜色精品国产| 精品水蜜桃久久久久久久| 亚洲人成网站999久久久综合 | 久久久久99精品成人片牛牛影视| 久久国产成人亚洲精品影院| 亚洲日韩欧美一区久久久久我| 合区精品久久久中文字幕一区| 国内精品九九久久精品| 精品蜜臀久久久久99网站| 超级碰久久免费公开视频| 亚洲精品无码久久久影院相关影片 | 国产精品VIDEOSSEX久久发布 | 香蕉久久一区二区不卡无毒影院| 久久综合视频网站| 亚洲精品国产成人99久久| 亚洲欧美一区二区三区久久| 国产精品久久久久久久久鸭 | 91久久精品91久久性色| 国内精品久久人妻互换| 久久久国产精品| 999久久久无码国产精品| 久久亚洲精品国产精品婷婷|