遞迴和非遞迴實現歸併排序

2021-07-31 05:28:29 字數 2495 閱讀 6839

1、遞迴實現歸併排序

遞迴排序其實也是利用了完全二叉樹的結構形式,所以時間複雜度和logn掛鉤的。具體遞迴版的歸併排序呢,看下面的**:

public

class

ms ;

print(s);

mergesort(s);

system.out.println("排序後的陣列:");

print(s);

}public

static

void

mergesort(int data)

public

static

void

sort(int data, int left, int right)

/**

* 將兩個陣列進行歸併,歸併前面2個陣列已有序,歸併後依然有序

* *@param data

* 陣列物件

*@param left

* 左陣列的第乙個元素的索引

*@param center

* 左陣列的最後乙個元素的索引,center+1是右陣列第乙個元素的索引

*@param right

* 右陣列最後乙個元素的索引

*/public

static

void

merge(int data, int left, int center, int right) else

} // 剩餘部分依次放入臨時陣列(實際上兩個while只會執行其中乙個)

while (mid <= right)

while (left <= center)

// 將臨時陣列中的內容拷貝回原陣列中

// (原left-right範圍的內容被複製回原陣列)

while (tmp <= right)

} public

static

void

print(int data)

system.out.println();

} }

執行結果如下:

5 3 6 2 1 9 4 8 7 

3 5 6 2 1 9 4 8 7

3 5 6 2 1 9 4 8 7

3 5 6 1 2 9 4 8 7

1 2 3 5 6 9 4 8 7

1 2 3 5 6 4 9 8 7

1 2 3 5 6 4 9 7 8

1 2 3 5 6 4 7 8 9

1 2 3 4 5 6 7 8 9

排序後的陣列:

1 2 3 4 5 6 7 8 9

2、非遞迴實現歸併排序

由於遞迴的過程中要用到棧,那麼這無疑會增加額外的時間和空間消耗,因此,在選擇時,有限選擇非遞迴版的歸併演算法。具體**如下:

package 排序;

//非遞迴實現歸併排序

public

class newms ;

print(s);

mergesort2(s);

system.out.println("排序後的陣列:");

print(s);

}private

static

void

mergesort2(int s)

}private

static

void

mergepass(int s, int k, int len)

if(i1)

}private

static

void

merge(int s, int left, int m, int right)

}while(left<=m)

while(j<=right)

while(third<=right)

}private

static

void

print(int s)

system.out.println();

}}

執行結果如下:

5 3 6 2 1 9 4 8 7 

3 5 6 2 1 9 4 8 7

3 5 2 6 1 9 4 8 7

3 5 2 6 1 9 4 8 7

3 5 2 6 1 9 4 8 7

2 3 5 6 1 9 4 8 7

2 3 5 6 1 4 8 9 7

1 2 3 4 5 6 8 9 7

1 2 3 4 5 6 7 8 9

排序後的陣列:

1 2 3 4 5 6 7 8 9

以上就是關於歸併排序的程式部分,望共享。

排序 歸併排序 遞迴和非遞迴實現

歸併排序的遞迴實現 import math 遞迴實現 defmerge sort arr if len arr 2 return arr middle math.floor len arr 2 left,right arr 0 middle arr middle return merge merge...

歸併排序 遞迴和非遞迴

一 遞迴 遞迴版本 採用分治的方法,將n個元素自頂向下分成兩個n 2的子問題,再將子問題進行劃分,最終將整個問題分解成每個字表長度為 1 的有序表,然後自底向上成對歸併。include int b 100 中間過程陣列 void merge int a,int low,int mid,int hig...

歸併排序的遞迴和非遞迴實現

歸併排序是乙個時間複雜度為o nlogn 的演算法,它可以由遞迴和非遞迴兩種方式實現。遞迴 includeusing namespace std void combine int nums,int l,int m,int r else while i m while j r k 0 for i l ...