分析歸併排序可知:最底層的合併元素之間的間隔為1,越向上,間隔則變為原來的兩倍,基於此我們有如下的非遞迴實現方案:
package com.dlut.sort;
import org.junit.test;
public class norecurmergesort ;
@test
public void printmergesort() }
/*** 合併陣列的長度從1開始遞增
* @param arr
* @param temparr
* @param low
* @param high
*/public void mergesort(int arr,int temparr,int low,int high)
mergearr(arr, temparr, (j+arr.length-1)/2, j, arr.length-1);
}} mergearr(arr, temparr, (low + high)/2, low, high);
} /**
* 合併函式:合併兩個相鄰的有序的陣列
* @param arr
* @param temparr
* @param center
* @param low
* @param high
*/public void mergearr(int arr,int temparr,int center,int low,int high)
else
} while (leftlow <=center)
temparr[temppos++] = arr[leftlow++];
while (rightlow <= high)
temparr[temppos++] = arr[rightlow++];
/** 這一步是必須的,因為你是在arr上進行歸併排序。一定要將本次的結果放到arr上。
* 試想如果沒有放入arr中,則會出現,某一位置的元素經過多次的交換後又回到該位置
*/for (int i = low; i <= high; i++)
}}
歸併排序 非遞迴實現
我們知道,遞迴實現的缺點就是會一直呼叫棧,而棧記憶體往往是很小的。所以,我們嘗試著用迴圈的辦法去實現歸併排序。之氣提到過,歸併排序的基本思路是將待排序序列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...
歸併排序的遞迴,非遞迴實現
和選擇排序一樣,歸併排序的效能不受輸入資料的影響,但表現比選擇排序好的多,因為始終都是o n log n 的時間複雜度。代價是需要額外的記憶體空間,o n 的額外空間。該演算法是採用分治法 歸併排序是一種穩定的排序方法。將已有序的子串行合併,得到完全有序的序列 public int mergesor...