/**
* 有問題
* 歸併排序---非遞迴
* 基本排序:歸併(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表示。現在的任務是把若...