演算法學習之二 歸併排序

2021-07-31 05:04:16 字數 1760 閱讀 7651

將陣列分為兩半,將每部分遞迴的應用歸併排序,直至不能分解為止。在兩部分都排好序後,對它們進行歸併。用圖說明:

這裡涉及到遞迴,有點不好理解:當將乙個length為8的陣列拆分為兩半:左陣列和右陣列。只要左邊陣列長度不為1,就還要拆分,那就遞迴呼叫,直到長度為1,同理,右邊陣列也是如此的拆分。等拆分好的陣列長度都是為1的時候,就開始兩兩陣列排序合併。

public

class meargesort

}private

static

int sort(int firsthalf, int secondhalf) else

}//以上比較完之後,有可能firsthalf還有元素沒有比較到或是secondhalf中的元素還有沒有比較到的

while(currentindex1//將firtshalf中剩餘的元素都複製到temp中;

temp[currentindex3++] = firsthalf[currentindex1++];

}while(currentindex2//secondhalf中剩餘的元素都複製到temp中;

temp[currentindex3++] = secondhalf[currentindex2++];

}return temp;}}

測試看下結果:

int list2 =;

meargesort.meargesort(list2);

for(int i = 0;i

length;i++)

從列印台可以看到list2 是乙個已經排好序的陣列。

1. sort方法分析:看看是如何將已經排序好的陣列合併為乙個陣列

以下圖示例:三個指標都指向初始化位置,兩兩比較,哪個元素小,就先放置在temp中,同時被拿取的元素的指標+1,沒有拿取的元素位置不變,重複比較操作,直到有乙個或是2個陣列的指標指向元素末尾處。

最後如果陣列1或是2中還有剩餘元素,直接複製到temp中。

2. 遞迴處分析:

先看如下** :左邊陣列的遞迴呼叫

我用文字說明下:

(1) 判斷陣列長度,如果長度大於1,將陣列分為a0陣列,a1陣列。

(2) 繼續判斷a0長度,如果還是大於1.將a0分為a01,a02

(3)假設在n次分割之後,某個分組的長度最終為1了,此時不再遞迴呼叫。

public

static

void meargesort(int list)

(4)再看下面的**:是對右邊分組的遞迴呼叫,和左邊分組過程是一樣的。
public

static

void meargesort(int list)

(5)對拆分為最小單位的小分組排序。所以,經過遞迴分解,和排序 ,firsthalf,secondhalf最終都會是排序好的。整合這兩者之後,完成排序。
int result = sort(firsthalf,secondhalf);

演算法學習(排序二)歸併排序

歸併排序所採用的思想是分治法,即 分解 解決 合併 假設面對乙個無序的陣列,如,將其分解為左右兩個陣列,但此時這兩個陣列還是無序的,因此,還需要進一步的分解,經過若干步之後,分解後如下所示 當每個陣列中僅有乙個元素的,可以認為此陣列是有序的,接下來,這些陣列兩兩合併,最後乙個組合成乙個完整的有序陣列...

排序演算法學習 歸併排序

歸併排序 merge sort 採用分治思想,將排序的過程分成乙個個子過程,當所有子過程完成時,排序也最終完成了。而歸併排序是將陣列不斷地二分,進而形成乙個個子過程。子過程,即歸併的過程如下圖演示,需要額外開闢一片空間進行複製乙份原陣列,然後兩邊逐一進行比較後進行歸併。至於它的時間複雜度,我們可以看...

遞迴演算法學習(歸併排序)

歸併排序是利用遞迴和分而治之的技術將資料序列劃分成為越來越小的半子表,再對半子表排序,最後再用遞迴步驟將排好序的半子表合併成為越來越大的有序序列,歸併排序包括兩個步驟,分別為 1 劃分子表 2 合併半子表 首先我們來討論歸併演算法,歸併演算法將一系列資料放到乙個向量中,索引範圍為 first,las...