歸併排序非遞迴實現Java

2021-08-02 21:49:56 字數 720 閱讀 6613

遞迴實現的歸併排序,需要o(lgn)的棧空間,而非遞迴實現的歸併排序則不需要

public class sort 

}//mergepass方法負責將陣列中的相鄰的有k個元素的字序列進行歸併

private static void mergepass(int arr, int k, int n)

//這段**保證了,將那些「落單的」長度不足兩兩merge的部分和前面merge起來。

if(i < n - k )

}//merge函式實際上是將兩個有序陣列合併成乙個有序陣列

//因為陣列有序,合併很簡單,只要維護幾個指標就可以了

private static void merge(int arr, int low, int mid, int high)

//接下來兩個while迴圈是為了將剩餘的(比另一邊多出來的個數)放到temp陣列中

while(i <= mid)

temp[k++] = arr[i++];

while(j <= high)

temp[k++] = arr[j++];

//將temp陣列中的元素寫入到待排陣列中

for(int l = 0; l < temp.length; l++)

arr[low + l] = temp[l];

}}

歸併排序 非遞迴實現

我們知道,遞迴實現的缺點就是會一直呼叫棧,而棧記憶體往往是很小的。所以,我們嘗試著用迴圈的辦法去實現歸併排序。之氣提到過,歸併排序的基本思路是將待排序序列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...