排序演算法,說真的,就是乙個排列順序的演算法,有些廢話了哈,不過話說回來,順序對於我們實現某些功能有很大的幫助,然而如何能夠快速的將乙個無序數列排列好呢?這次整理了幾種排序方法,總結講述了一下實現的原理以及過程,話比較直接,相信各位看官看**也許比我說要好得多,直接開始吧。
單單看這個名字,歸併,歸併什麼呢,當然是歸併我們要排列的數列,或者某個含有順序的內容串,那為什麼要歸併呢,因為他們分開了呀,為什麼分開了呀?簡單一點說就是為了方便比較以及處理。如果我們能理解好這個過程,其是歸併排序我們也就大體了解了大部分內容了,只不過我們需要將兩個過程細化,用**實現,來上**:
public class mergesort
private static void merge(int array, int left, int mid, int right) else
}//可以看到上面的for迴圈只要有乙個到達末尾就停止了,所以,
//分成的兩個陣列大小不一樣時,就容易產生這樣的情況,所以
//需要將剩餘的部分輸入到temp結果陣列中
for(; i < mid; k++)
for(; j < right; k++)
//將某次排序的結果重新拷貝回原來的陣列
for (i = left, k = 0; i < right; i++)
}/**
* 列印函式
* @param array 被列印陣列
*/public static void print(int array) }}
分析一下可以看到,每次排序所花費的事件為lgn,所以此方法排序所用的時間的o(nlgn)。對於歸併排序來說重要的內容為歸併和關鍵位置,即邊界的準確確定,這樣能夠保證演算法的基本功能能夠實現,其次控制好遞迴,理解遞迴所表述的過程,這樣就能順利的理解歸併排序了。參考的有些資料說,某些情況下,我們可以結合插入排序達到排序速度提高的目的,當然前提是歸併排序中將陣列劃分到一定範圍內時,此時若採用插入排序,效果會比上面的歸併排序演算法要好,那我們怎麼設計呢,仔細思考一下其是還是有思路的,我們要替換的為元素個數小於乙個特定值時,我們採用插入排序,其是對應的為止為我們的遞迴的出口,也就是說當我們劃分到小於這個特定值時,就要執行插入排序了,同時,還要保證歸併的時候其他部分繼續使用merge,所以我們進行如下設計:
//閾值,當元素數量小於此值時,將進行insert排序
private static final int insection_sort_therhold = 20;
/***merge 部分不變,修改mergesort部分
*/ public static void mergesort_mix_isnertion(int array, int left, int right)else
}/**
*insertion排序方法
*/public static void insertion_sort(int array, int left, int right)
array[i + 1] = key;}}
測試結果如下:
public static void main(string args)
long starttime2 = system.currenttimemillis();
//在這裡說一下關於array.length和array.length - 1區別:在這裡的賦值
//其實和後面呼叫的函式有關,有關的位置已經標識。
mergesort(array2,0,array2.length);
long endtime2 = system.currenttimemillis();
system.out.println("mergesort used time" +(endtime2 - starttime2));
long starttime = system.currenttimemillis();
mergesort_mix_isnertion(array1,0,array1.length );
long endtime = system.currenttimemillis();
system.out.println("mergesort_mix_insection used time" + (endtime - starttime));}}
在這裡隨機生成了array1和array2兩個陣列,都有100000000個數字,並分別用兩個方法進行排序,將閾值設定為20時,執行時間分別為:
單位為ms,可以看到,混合插入排序的演算法相比原來的演算法有一定的提公升,所以有些時候,分析資料以及資料輸入特徵,以及輸入的內容是有必要的,分析可以讓自己設計出更為高效的**完成工作。
歸併排序整理
歸併排序介紹 歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 演算法複雜度 歸...
演算法整理(3) 歸併排序
3.1 時間複雜度 由於無論陣列中元素如何排列,排序時所需做的操作都一樣,所以此演算法的最優時間複雜度和最差時間複雜度都為 o n logn o nlogn o nlog n 3.2 原理 歸併排序是一種基於分治法 divide and conquer 的排序方式。演算法的實現主要基於將已有序的子串...
排序小結 5 歸併排序
歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出...