今天學習到了新演算法,歸併排序;歸併排序演算法的思想和快速排序有點類似;但仔細一想區別還是挺大;
歸併排序(從下往上):將陣列分為n個長度為2的陣列,然後再將相鄰陣列合併排序,直到合併為完整陣列;
我寫歸併的思路:
1、將整個陣列分成n個長度為len的子陣列(len初始值為2)
2、分別對子陣列排序;
3、遞迴合併相鄰陣列,重複1,2;每次遞迴len*2;
4、遞迴出口:len>陣列長度;
public void merge(inta,int length)
/***
* 在這裡選擇:插入排序,因為合併的相鄰陣列相對有序
* @param a
* @param i 陣列起始位置
* @param len
*/public void pp(inta ,int i,int len)
a[j] = xx;
j=x;
} }
感覺還有太多地方需要改進;其中插入排序這個地方還是可以改進的;
整體感覺歸併的這種寫法不好,這次就先寫到這裡,明天有空改進了再寫
***************==20180611*************************
對於上面演算法的改進,沒有什麼動力。因為這種改進,沒有對自己思考上的提公升;
下面來看下
歸併排序的另一種解法:
1、將陣列二分;
2、遞迴,繼續將2個子陣列二分;
3、出口right >mid;
先看**:
public static void merge1(inta,int left,int mid,int right)
merge(a,left,mid,right);//對陣列在[left,right]區間的排序
}
看到**之後自然不難理解為什麼出口條件的設定;
這個方法最精髓的地方,就是巧妙的利用遞迴將陣列二分;
歸併排序 Java實現
歸併排序 mergesort 1 思想 多次將兩個或兩個以上的有序表合併成乙個新的有序表。2 演算法時間複雜度 最好的情況下 一趟歸併需要n次,總共需要logn次,因此為o n logn 最壞的情況下,接近於平均情況下,為o n logn 說明 對長度為n的檔案,需進行logn 趟二路歸併,每趟歸併...
Java實現歸併排序
剛開始接觸歸併排序的時候,感覺挺困難的,但是仔細的分析之後,就會發現它的原理還是蠻簡單的 就是借助另外的乙個陣列空間將左右兩側 從中間mid處劃分 已經排序好的原陣列轉到新的陣列空間。如下圖所示 轉移操作時,就是左右所指的資料進行比較,將較小的資料 由小到大排序 儲存到新的陣列空間。如下圖所示 了解...
Java實現歸併排序
思想就是 將陣列分成兩個陣列,如果兩個陣列的元素都是有序的,那麼就可以很方便的將這兩組資料歸併。如果沒有序繼續將兩組陣列分組,以此類推,當組內只有乙個資料時,認為這個小組內已經有序,然後合併相鄰兩個小組就可以。package sort 歸併排序 2015 05 31 public class mer...