a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

合并排序(C語言實現)

2020-01-26 16:22:03
字體:
來源:轉載
供稿:網友

其基本模式如下:

分解:把一個問題分解成與原問題相似的子問題

解決:遞歸的解各個子問題

合并:合并子問題的結果得到了原問題的解。

現在就用遞歸算法,采用上面的分治思想來解合并排序。

                      合并排序(非降序)

分解:把合并排序分解成與兩個子問題

偽代碼:

復制代碼 代碼如下:

MERGE_SORT(A, begin, end)

if begin < end

   then mid<- int((begin + end)/2)

           MERGE_SORT(A, begin, mid)

           MERGE_SORT(A, mid+1, end)

           MERGE(A, begin, mid, end)


解決:遞歸的解各個子問題,每個子問題又繼續遞歸調用自己,直到"begin<end"這一條件不滿足時,即"begin==end"時,此時只有一個元素,顯然是有序的,這樣再進行下一步合并。


合并:合并的子問題的結果有個隱含問題,即各個子問題已經是排好序的了(從兩個氮元素序列開始合并)。做法是比較兩個子序列的第一個元素小的寫入最終結果,再往下比較,如下圖所示:

        圖中:待排序數組為2 4 6  1 3 5

        把2 4 6和 1 3 5 分別存到一個數組中,比較兩個數組的第一個元素大小小者存于大數組中,直到兩小數組中元素都為32767.

        這里32767 味無窮大,因為 c語言中  int類型是32位,表示范圍是-32768-----32768。用無窮大作為靶子可以減少對兩個小數組是否為空的判斷,有了靶子,直接判斷大數組元素個數次就排完了。 

     在整個過程中執行過程示如下圖:

分解+執行時自上向下,合并時自下向上。

 代碼奉上:

復制代碼 代碼如下:

#include <stdio.h>

void MERGE(int *A, int b, int m, int e)

{      

        int l = m-b+1, r = e-m, i;

        int L[l+1], R[r+1];

        for(i=0; i< l; i++)

        {

            L[i] = A[b+i];

        }

        for (i=0; i< r; i++)

        {

            R[i] = A[m+i+1];

        }

        L[l] = 32767;

        R[r] = 32767;

        l = 0;

        r = 0;

        for(i=0; i< e-b+1; i++)

        {

            if(L[l] < R[r])

            {

                A[b+i] = L[l];

                l ++;

            }

            else            {

                A[b+i] = R[r];

                r ++;

            }

        }

}

 

void MERGE_SORT(int *A, int b, int e)

{

        if(b < e)

        {

            int m = (b + e) / 2;

            MERGE_SORT(A, b, m);

            MERGE_SORT(A, m+1, e);

            MERGE(A, b, m, e);

        }

}

int main()

{

        int A[500];

        int lens, i;

        printf("Please Enter the lenghth of array:");

        scanf("%d", &lens);

 

        printf("Please Enter the elements of the array:");

        for(i=0; i< lens; i++)

            scanf("%d", &A[i]);

 

        MERGE_SORT(A, 0, lens-1);

 

        printf("the result of the sort is:/n");

        for(i=0; i< lens; i++)

        {

            printf("%d ", A[i]);

        }

        return 0;

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 国产九九九精品视频 | 国产精品美女久久 | 日本成人黄色网址 | 九色一区二区 | 一区二区三区国产 | 色网站在线观看 | 亚洲一区二区三区视频 | 大片黄网站 | 香蕉视频在线播放 | 亚洲欧美aa| 久久99蜜桃综合影院免费观看 | 免费v片在线观看 | 久久久久久国产精品美女 | 最新国产精品精品视频 | 爱爱爱av | av青青 | 国产中文字幕在线 | 凹凸日日摸日日碰夜夜 | 国产精品美女www爽爽爽软件 | 成人在线欧美 | 久久精品黄 | 久久久久国产精品视频 | 久久久精品综合 | 青草成人免费视频 | 亚洲六月丁香色婷婷综合久久 | 九九色综合 | 成年人性视频 | 免费不卡视频 | 国产精品久久久久高潮色老头 | av在线免费观看网站 | 亚洲网在线 | 91欧美激情一区二区三区成人 | 欧美日韩免费一区二区三区 | 性高湖久久久久久久久 | 亚洲精品66 | 亚洲九九 | 国产精品久久久久久久久动漫 | 一级日韩片 | 中文字幕免费观看 | 精品一区二区三区不卡 | 国产噜噜噜噜噜久久久久久久久 |