排序演算法 歸併排序 1 非遞迴方法

2021-08-21 13:07:38 字數 1687 閱讀 3874

/** 

* 有問題

* 歸併排序---非遞迴

* 基本排序:歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。

* 然後再把有序子串行合併為整體有序序列。

* 歸併排序是建立在歸併操作上的一種有效的排序演算法。

* 該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。

* 歸併排序是一種穩定的排

* 步驟:

* 1、divide: 把長度為n的輸入序列分成兩個長度為n/2的子串行。

* 2、conquer: 對這兩個子串行分別採用歸併排序。

* 3、combine: 將兩個排序好的子串行合併成乙個最終的排序序列。

*/public

class

mergesort else

}// 若第一段序列還沒掃瞄完,將其全部複製到合併序列

while (i <= mid)

// 若第二段序列還沒掃瞄完,將其全部複製到合併序列

while (j <= high)

// 將合併序列複製到原始序列中

for (k = 0, i = low; i <= high; i++, k++)

}public

static

void

mergepass(int array, int gap, int length)

// 餘下兩個子表,後者長度小於gap

if (i + gap - 1

< length)

}/**

* 排序前: 9 1 5 3 4 2 6 8 7

gap = 1: 1 9 3 5 2 4 6 8 7

gap = 2: 1 3 5 9 2 4 6 8 7

gap = 4: 1 2 3 4 5 6 8 9 7

gap = 8: 1 2 3 4 5 6 7 8 9

排序後: 1 2 3 4 5 6 7 8 9

*@param list

*@return

*/public

static

int sort(int list)

return list;

}// 列印完整序列

public

static

void

printall(int list)

system.out.println();

}public

static

void

main(string args) ;

mergesort merge = new mergesort();

system.out.print("排序前:\t\t");

merge.printall(array);

merge.sort(array);

system.out.print("排序後:\t\t");

merge.printall(array);

}}

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

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

歸併排序 非遞迴

static void merging sort beta int a 歸併排序演算法 非遞迴 static void mergepass int source,int temp,int gap,int len if i len gap else static void merge beta int...

歸併排序(非遞迴)

接著上篇文章歸併排序 遞迴 來 下,歸併排序的非遞迴實現。歸併排序的非遞迴實現 1 將兩個相鄰的有序序列歸併成乙個有序序列,我們稱為 一次歸併 2 一趟歸併 是多次執行 一次歸併 的結果。在 一趟歸併 中,除最後乙個有序序列外,其他有序序列中記錄的個數 稱為序列長度 相同,用h表示。現在的任務是把若...