誰能給個簡單的C語言歸併排序演算法的例子啊?謝謝 20

2025-01-22 00:45:15 字數 3680 閱讀 6841

誰能給個簡單的c語言歸併排序演算法的例子啊?謝謝

1樓:走召弓雖人

#include

#include

#include

#include

#define m 11

typedef int keytype;

typedef int elemtype;

struct rec

keytype key;elemtype data;

typedef rec sqlist[m];

void output( sqlist r, int n )for ( int i = 0; i < n; i++cout int i, j, k;

for ( i = m; i < n - 1; i++k = i;

for ( j = i; j < n; j++if ( b[k].key > b[j].key )k = j;

if ( k !=i )

rec temp = b[k];

b[k] =b[i];b[i] =temp;

void merge( sqlist r, int l, int m, int h, sqlist r2 )

xuanze( r, l, m );

xuanze( r, m, h );

output( r, m );

int i, j, k;

k = i = l;

for ( j = m; i < m &&j < h; k++if ( r[i].key <=r[j].key )r2[k] =r[i];i++;

elser2[k] =r[j];j++;

output( r2, m );

while ( j < h )

r2[k] =r[j];j++;k++;

while ( i <=m )

r2[k] =r[i];i++;k++;

output( r2, m );

void main()

cout 《執行結果:";

sqlist a, b;int i, j = 0, k = m / 2, n = m;

srand( time( 0 )

for ( i = 0; i < m; i++a[i].key = rand() 80;b[i].key = 0;

cout 《排序前陣列:";

output( a, m );

cout 《陣列排序的過程演示:";

merge( a, j, k, n, b );

cout 《排序後陣列:";

output( b, m );

歸併排序演算法是什麼?

2樓:休閒娛樂達人天際

歸併排序(merge sort)是建立在歸併操作上的一種有效,穩定的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。

歸併操作的工作原理如下:第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列。

第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置。

重複步驟3直到某一指標超出序列尾。

將另一序列剩下的所有元素直接複製到合併序列尾。

歸併排序演算法是什麼?

3樓:愛探析社會的小童

歸併排序演算法定義如下:歸併排序演算法就是利用分治思想將陣列分成兩個小組a,b,再將a,b小組各自分成兩個小組,依次類推,直到分出來的小組只有乙個資料時,可以認為這個小組已經是有序的了,然後再合併相鄰的二個小組就可以了。這樣通過先遞迴的分解陣列,再合併陣列,就完成了歸併排序。

歸併排序演算法特點:由於歸併排序在歸併過程中需要與原始記錄序列同樣數量的儲存空間存放歸併結果以及遞迴時深度為log2n(2為底)的棧空間。

因此空間複雜度為o(n+logn),merge函式中if(sr[i]

排序演算法(二):遞迴排序之歸併排序

4樓:亞浩科技

遞迴就是函式呼叫本身,和高中數學的數學歸納法類似。當在求乙個陣列的第n項的時候,有兩種方式,第一種就是根據各種公式,求通項公式,第二種,就是數學歸納法,發現資料項前後兩項的規律。可以這麼說,遞迴只要知道開始的特殊情況,知道過程是如何的。

遞推:相反使用乙個迴圈來實現,但有的時候遞推有一定難度,不過可以使用棧來實現消除遞迴,這麼說,一些編譯器都是用棧來實現遞迴的)

歸併排序的原理是,合併兩個有序的陣列。兩個有序數的合併相對較為簡單, 通常遍歷一遍就可以合併。因此只要保證兩個陣列是有序,然後進行一次合併,就得到乙個有序陣列。

那麼,上述的過程已經發現了,假設要對乙個陣列進行排序,那麼可以將其一分為二,得到兩個陣列,那麼如何保證這兩個陣列有序的。這裡已經很明顯的,問題又回到開頭,也就是遞迴(呼叫函式本身)。遞迴不能只是關注過程,也要關注(邊界問題),不然可能會陷入死迴圈,甚至座標越界。

現在的(邊界)就是,何時,陣列不可再分?很顯然,就是也就是陣列小於二。換而言之,就是陣列大於一是呼叫函式本身。

歸併排序的演算法原理是什麼?

5樓:電商運營的機會

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。

歸併排序基本原理。

通過對若干個有序結點序列的歸併來實現排序。

所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。

歸併排序基本思想。

設兩個有序的子序列(相當於輸入序列)放在同一序列中相鄰的位置上:array[low..m],array[m + 1..

high],先將它們合併到乙個區域性的暫存序列 temp (相當於輸出序列)中,待合併完成後將 temp 複製回 array[low..high]中,從而完成排序。

在具體的合併過程中,設定 i,j 和 p 三個指標,其初值分別指向這三個記錄區的起始位置。合併時依次比較 array[i] 和 array[j] 的關鍵字,取關鍵字較小(或較大)的記錄複製到 temp[p] 中,然後將被複制記錄的指標 i 或 j 加 1,以及指向複製位置的指標 p加 1。重複這一過程直至兩個輸入的子序列有乙個已全部複製完畢(不妨稱其為空),此時將另一非空的子序列中剩餘記錄依次複製到 array 中即可。

c語言做各種排序演算法比較程式怎麼做?

6樓:水清月下談

按照程式設計的自頂向下,逐步求精的機構化程式設計思想來完成這個任務。

大概的頂層框架是:隨機數產生模組,檔案儲存模組,排序以及統計排序過程資訊的模組。

分別設計出隨機數產生演算法,三種排序演算法。

按照邏輯的順序進行組裝,並給出必要的過程資訊。

演算法的設計實現以及程式執行結果:

7樓:匿名使用者

已經有時間讀啦,自己測就用大量資料排序計時(只即排序時間,別記讀取和輸出時間)啦。

誰能給我個王者榮耀的號,誰能給我個王者榮耀的號

我。才怪 我可以!你qq號多少?誰能借個王者榮耀的號給我玩 你要借號玩?首先沒人願意,因為你可能會造成賬號的損失,其次你花了時間幫別人打,對你來說不是也挺不值的麼 平臺借號都不敢信,現在別人借號都不知道是怎麼你的號 呵呵,一個人一個號,都是自己玩兒自己的呢,不能借啊 一個人一個號,你多準備幾個手機玩...

誰能給我個活著的理由

每一個人都有階段性灰暗期,如果活下去的你,以後回想起這些的時候,也許連灰暗都稱不上。我們一旦死去,將會是永遠。天地之間,獨一無二的個體,就這樣沒了,從此不復再有。和這樣永恆的消失相比,現在的活著充滿了一種可體驗和感知的欣喜,就象若干時之前你不知道此刻的不想活一樣,若干時之後你或許就會用一種廢棄的眼光...

有誰能給我繼續活下去的理由,有誰能給我一個繼續活下去的理由

很多人五官不全或者身有殘疾都必須要堅強生活下去,為什麼你一個正常的人就不能夠生活下去呢。好好把握好現在生存的機會吧。心態放正!不為別人活為自己活!父母永遠是心疼自己的孩子的,只是你現在沒理解到他們的苦心,等你以後有了自己的孩子你會明白他們的用心良苦!難道你的父母都成不了你活下去的理由嗎?不要太悲觀,...