成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C語言實現合并排序

開發 后端
遞歸算法是把一個問題分解成和自身相似的子問題,然后再調用自身把相應的子問題解決掉。這些算法用到了分治思想。

其基本模式如下:

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

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

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

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

合并排序(非降序)

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

偽代碼:

  1. MERGE_SORT(A, begin, end) 
  2. if begin < end 
  3.    then mid<- int((begin + end)/2) 
  4.            MERGE_SORT(A, begin, mid) 
  5.            MERGE_SORT(A, mid+1, end) 
  6.            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。用無窮大作為靶子可以減少對兩個小數組是否為空的判斷,有了靶子,直接判斷大數組元素個數次就排完了。 

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

        [[64395]]

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

 代碼奉上:

 

  1. #include <stdio.h> 
  2. void MERGE(int *A, int b, int m, int e) 
  3. {        
  4.         int l = m-b+1, r = e-m, i; 
  5.         int L[l+1], R[r+1]; 
  6.         for(i=0; i< l; i++) 
  7.         { 
  8.             L[i] = A[b+i]; 
  9.         } 
  10.         for (i=0; i< r; i++) 
  11.         { 
  12.             R[i] = A[m+i+1]; 
  13.         } 
  14.         L[l] = 32767; 
  15.         R[r] = 32767; 
  16.         l = 0; 
  17.         r = 0; 
  18.         for(i=0; i< e-b+1; i++) 
  19.         { 
  20.             if(L[l] < R[r]) 
  21.             { 
  22.                 A[b+i] = L[l]; 
  23.                 l ++; 
  24.             } 
  25.             else            { 
  26.                 A[b+i] = R[r]; 
  27.                 r ++; 
  28.             } 
  29.         } 
  30. void MERGE_SORT(int *A, int b, int e) 
  31.         if(b < e) 
  32.         { 
  33.             int m = (b + e) / 2; 
  34.             MERGE_SORT(A, b, m); 
  35.             MERGE_SORT(A, m+1, e); 
  36.             MERGE(A, b, m, e); 
  37.         } 
  38. int main() 
  39.         int A[500]; 
  40.         int lens, i; 
  41.         printf("Please Enter the lenghth of array:"); 
  42.         scanf("%d", &lens); 
  43.         printf("Please Enter the elements of the array:"); 
  44.         for(i=0; i< lens; i++) 
  45.             scanf("%d", &A[i]); 
  46.         MERGE_SORT(A, 0, lens-1); 
  47.        printf("the result of the sort is:\n"); 
  48.         for(i=0; i< lens; i++) 
  49.         { 
  50.             printf("%d ", A[i]); 
  51.         } 
  52.         return 0; 

原文鏈接:http://www.cnblogs.com/kaituorensheng/archive/2013/02/21/2919934.html

【編輯推薦】

責任編輯:彭凡 來源: 博客園
相關推薦

2022-11-01 18:29:25

Go語言排序算法

2023-05-08 07:55:05

快速排序Go 語言

2010-02-05 15:59:26

C++函數重載

2023-12-07 12:59:46

C語言循環隊列代碼

2023-10-09 07:11:03

排序算法序列

2023-12-15 10:03:37

C++算法鏈表

2010-06-02 09:14:53

GCC編譯器Linux

2020-07-24 09:40:04

C語言OOP代碼

2022-10-12 08:38:51

C語言classC++

2011-03-04 10:04:31

Linux文件操作命令

2021-02-19 11:55:36

C語言MD5加密

2023-10-07 08:11:22

代碼模板合并排序

2010-03-22 17:30:18

Python對象

2018-06-22 10:30:56

C語言虛擬機編譯器

2011-08-05 17:54:33

Cocoa Touch 多語言

2017-02-23 09:00:42

2020-08-12 08:56:30

代碼凱撒密碼函數

2024-08-29 13:23:04

WindowsGo語言

2020-03-05 15:34:16

線程池C語言局域網

2011-04-20 14:29:07

歸并排序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精品一区 | 国产91成人 | 欧美高清免费 | 国产欧美一区二区三区在线看蜜臀 | 日韩手机在线视频 | 日本一区二区不卡视频 | 国产黄色电影 | 欧美久久久久久久久中文字幕 | 国产日韩欧美二区 | 亚洲日韩中文字幕一区 | 国产高清精品一区二区三区 | 欧美日韩a | 色中文在线| 亚洲美女在线视频 | 日韩中文字幕一区二区三区 | 亚洲男人网 | 一区二区三区四区免费在线观看 | 精品视频免费在线 | 在线播放国产一区二区三区 | 9999国产精品欧美久久久久久 | 国产在线一区二 | 久久成人av| 免费一级欧美在线观看视频 | 午夜小视频在线观看 | 最新日韩在线 | 久产久精国产品 | 欧美日韩精品一区二区三区蜜桃 | 欧美精品成人一区二区三区四区 | 黄色一级大片在线免费看产 | 久久精品国产一区 | 91视频在线| 亚洲国产精品99久久久久久久久 | 性做久久久久久免费观看欧美 | 欧美视频二区 | 国产日韩精品视频 | 久久男人| 一级特黄色毛片 | 国产一区91精品张津瑜 | 中文字幕精品一区二区三区精品 | 久久av资源网 | 国产欧美在线观看 |