演算法入門 歸併排序非遞迴實現,大家一起來找茬啊

2021-07-26 08:38:08 字數 1244 閱讀 2971

放一幅圖在這裡,便於理解:

歸併排序主要是要先分解陣列,排序,然後再合併陣列。

通過歸併排序的原理,我們可以知道:

1、最小的分組單位是2個數字為一組,然後是4個數字,8個數字等等等。(這裡我們用步長來代稱每組數字個數)

2、若分組後剩下的數字個數比步長小,沒有關係,我們還是把他們算成乙個組來進行歸併。

排序是在兩個相鄰組別中進行排序。

1、排序的時候,先將兩個相鄰組別中最小的幾個數字挑出來,放到乙個臨時陣列中。

2、若第乙個組別中的數字沒有被挑完,則將它們依次放入臨時陣列。

3、若第二個組別中的數字沒有被挑完,將它們依次放入臨時陣列中。

1、把臨時陣列中的數字再copy回原陣列即可。

看看**:

/**

* merge sort without recursion

*@param result

*@return

*/public

int mergesort_not_recursion(int result)

// step one: split array [分解]

// split array

int gap, i = 0;

for (gap = 1; gap < length; gap *= 2)

// the rest of numbers to mergesort

if (i + gap < length)

}return result;

}public

int mergesort(int temp, int min, int middle, int high, int result)else

}// to store the rest of numbers to temp

while (i < middle)

// to store the rest of numbers to temp

while (j < high)

// step three:merge [歸併]

// to copy numbers back to result

int k = 0;

while (k < index)

return result;}}

歸併排序 非遞迴實現

我們知道,遞迴實現的缺點就是會一直呼叫棧,而棧記憶體往往是很小的。所以,我們嘗試著用迴圈的辦法去實現歸併排序。之氣提到過,歸併排序的基本思路是將待排序序列r 0 n 1 看成是n個長度為1的有序序列,將相鄰的有序表成對歸併,得到n 2個長度為2的有序表 將這些有序序列再次歸併,得到n 4個長度為4的...

歸併排序 非遞迴實現

1 歸併,非遞迴實現 1 段長度倍增,1,2,3,4,8,n 當要合併的單段長 2 以兩段的長度作為每次偏移的長度 每次合併是兩個單段一組進行合併,因此要不斷地偏移兩個單段的長度。5 3 5 2 8 7 2 3 5 7 8 include include include using namespac...

歸併排序(遞迴 非遞迴 自然歸併排序)

演算法思想 歸併排序是分治法的典型應用,其思想是不斷地將兩個有序的陣列合併為乙個有序陣列。遞迴實現 include void merge int a,int left,int m,int right void mergesortaux int a,int left,int right void me...