1、歸併排序(Merging Sort)
“歸併的含義是將兩個或者兩個以上的有序表組合成一個新的有序表”。無論是順序存儲結構還是鏈表存儲結構,夠可在O(m+n)的時間量級上實現(書中概念) 。換言之,就是將兩個有序表合併成一個。
2、一種簡單的歸併排序實現
① 首先將待排序列有序的化分爲若干子序列(假設是升序排序,則按照升序劃分)
②兩兩歸併,直至合併成一個序列
eg:
3、java實現(非遞歸)
僅供參考
public class MergeSortTest {
public static void main(String[] args) {
// TODO 自動生成的方法存根
int[] array = {49,38,65,97,76,13,27};
mergeSortDemo(array);
for(int x:array)
System.out.print(x + " ");
}
public static void mergeSortDemo(int[] array) {
int start1 = 0,start2 = 0,end1 = array.length-1,end2 = array.length-1;
//1、確定第一個子序列結束的位置
for(int i = 1; end1 < array.length;i++) {
if(array[i] < array[i-1]) {
end1 = i-1;
break;
}
}
while(end1 != array.length-1) {
//1、確定第二個子序列結束的位置
end2 = array.length-1;
for(int i = end1+1;i<array.length-1;i++) {
if(array[i] > array[i+1]) {
end2 = i;
break;
}
}
start2 = end1+1;//第二個子序列開始的位置 是 第一個子序列結束位置的下一個
merge(array,start1,end1,start2,end2);
end1 = end2;//下一次歸併:第一個子序列 結束的位置 是上一次歸併中第二個子序列結束的位置
}
}
//歸併
public static void merge(int[] array,int start1,int end1,int start2,int end2) {
//將兩個有序合併爲一個
int[] array1 = new int[end2+1];//創建一個信息數組
for(int i = 0; i <= end1;i++)//將第一個數組賦值給array1
array1[i] = array[i];
//將第二個數組插入到array1中
int index = 0;//第一次開始比較的地方
for(int i = start2;i <= end2;i++) {
boolean b = false;//設置當前元素是否插入
for(int j = index;j <= end1;j++) {
if(array1[j] > array[i]) {
b = true;
//從j開始 到end1向後移動
for(int k = end1;k >= j;k--)
array1[k+1] = array1[k];
array1[j] = array[i];
index = j;//下一次開始比較的位置,因爲是有序表 因此下一個元素插入時 不需要從頭開始比較
end1++;//數組1後移一個位置
break;
}
}
//判斷是否插入,如果沒插入 那麼直接將未插入的數與當前array1數組合並 並退出循環
if(b == false) {
for(int k = i;k<=end2;k++)
array1[k] = array[k];
break;
}
}
//將array1賦值給array
for(int i = 0;i < array1.length;i++) {
array[i] = array1[i];
}
}
}