歸併排序的非遞迴實現

2021-06-21 03:26:52 字數 1101 閱讀 7883

分析歸併排序可知:最底層的合併元素之間的間隔為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...