1. 程式人生 > >歸併排序及其複雜度分析

歸併排序及其複雜度分析

/*
* (二分)歸併排序(穩定演算法)
* 基本思想:將陣列遞迴分成越來越小的數集,直到每個數集只有一個數
* 然後將資料遞迴排序,使其合併成與原來資料一樣的有序序列
* 時間複雜度分析:遞迴分解資料,需要遞迴logN次,每次都需要對n個數據掃描一次,最好最壞平均都一樣,所以O(nlogn)
* 空間複雜度分析:歸併排序需要一個臨時temp[]來儲存歸併的結果,所以   O(n) 

* 基本實現:需要兩個函式,一個用來遞迴劃分陣列,比較簡單,依次二分即可
* 一個用來把劃分好的陣列遞迴排序併合並:兩個陣列從第一個元素開始比較,小的資料入,直到一個數組中資料為空,
* 然後把另一個數組中的剩餘資料寫入,最後用temp陣列替代初始的陣列
*/

public static  void merge(int a[],int start,int mid,int end){
int[] temp=new int[end-start+1];
int i=start;
int j=mid+1;
int k=0;
while (i <= mid && j <= end) {
if (a[i] < a[j]) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= end) {
temp[k++] = a[j++];
}
for(int m=0;m<temp.length;++m){
a[start+m]=temp[m];
}

}


}
/**
* @param a
* @param start  陣列索引
* @param end陣列索引,<.length
*/
public static void mergeSort(int a[],int start,int end){
int mid=(end+start)/2;
//int mid=start+(end-start)/2;
//System.out.println(mid);
if(start<end){
mergeSort(a,start,mid);
mergeSort(a,mid+1,end);
merge(a,start,mid,end);
}

}

Ps:博文為博主的學習筆記,演算法只是按照自己的理解簡單分析,初學者建議看詳細的圖文講解,如果有錯誤,歡迎交流指正

相關推薦

歸併排序及其複雜分析

/* * (二分)歸併排序(穩定演算法) * 基本思想:將陣列遞迴分成越來越小的數集,直到每個數集只有一個數 * 然後將資料遞迴排序,使其合併成與原來資料一樣的有序序列 * 時間複雜度分析:遞迴分解資料,需要遞迴logN次,每次都需要對n個數據掃描一次,最好最壞平均都一樣,所

演算法 歸併排序複雜分析(含圖解流程和Master公式)

圖解流程 整體流程如下: 細節流程: 第一步: 第二步: 第三步: 第四步: 第五步: 第六步: 第七步: 第八步:

插入排序和迭代歸併排序以及複雜分析

引言: 演算法是電腦科學中的基礎,程式=演算法+資料結構,演算法描述了我們將如何來處理資料的過程。本文將介紹兩種演算法的實現以及其中一種演算法的複雜度分析過程。1.  演算法介紹  歸併排序是利用歸併思想對數列進行排序,核心點是將陣列進行分組拆分,拆分到最小單元之時,即為有序

演算法分析——排序演算法(歸併排序複雜分析(遞迴樹法)

前面對演算法分析的一些常用的 漸進符號 做了簡單的描述,這裡將使用歸併排序演算法做為一個實戰演練。 這裡首先假設讀者對歸併排序已經有了簡單的瞭解(如果不瞭解的同學可以自行百度下歸併排序的原理)。瞭解此演算法的同學應都知道,歸併排序的主要思想是分而治之(簡稱分治)。分治演算法

演算法分析——排序演算法(歸併排序複雜分析(代換法)

上篇文章中我們對歸併排序的時間複雜度使用遞迴樹法進行了簡答的分析,並得出了結果歸併排序的時間複雜度為,這裡將使用代換法再進行一次分析。使用代換法解遞迴式的時候,主要的步驟有兩步:         1)猜測解的結果         2)使用數學歸納法驗證猜測結果      

演算法分析——排序演算法(歸併排序複雜分析(主定理法)

       前兩篇文章中分別是要用遞迴樹、代換法對歸併排序的時間複雜度進行了簡單的分析和證明,經過兩次分析後,我們發現遞迴樹法的特點是:可以很直觀的反映出整個歸併排序演算法的各個過程,但因為要畫出遞迴樹所以比較麻煩,所以遞迴樹演算法更適合新手,因為它可以讓分析者更直觀、簡易

快排和歸併排序複雜相同,為什麼都用快排而不用歸排?

快排和歸排的複雜度都是O(n*log n),為什麼都用快排而不用歸排? 看了《演算法圖解》之後,大致理解了是什麼原因,真正的原因是:不可描述的常量導致使用快排而不是歸排。 好了,真正的解釋是這樣的: 演算法的每一步實際上都需要一個固定時間量,被稱為常量。我們平時考慮時間複雜度的時候並

歸併排序時間複雜----主定理

http://blog.csdn.net/touch_2011/article/details/6785881 1、序言 2、歸併排序           2.1 引出            歸併排序又是另一類排序演算法,它是一種基於“分治”策略的一種演算法。歸

Python 搜尋、排序複雜分析

概述演算法是計算機程式的一個基本的構建模組。評價演算法質量的最基本的標準是正確性,另一個重要的標準是執行時間效能。當在一臺真實、資源有限的計算機上執行一個演算法的時候,經濟性的考慮就有了用武之地,這樣一個過程會消耗兩種資源:處理時間和空間或記憶體。統計指令用於估算演算法效能的

歸併排序空間複雜O(1)的實現

正常的歸併排序是利用分治法,即分解,解決,合併 //O(n)Membery mergeSort public void mergeSort(int[] nums) { int n = nums.length;

資料結構筆記----搜尋,排序複雜分析

演算法描述了最終能解決一個問題的計算過程。可讀性和易維護性是重要的質量指標。在計算機上執行演算法會消耗兩種資源:處理時間和空間或記憶體。當解決相同的問題或處理相同的資料集的時候,消耗這兩種資源較少的演算法會比消耗資源更多的演算法具有更高的質量,因此,它也是更加合適的演算法。3

氣泡排序(時間複雜分析)

氣泡排序: public static void bubbleSort(int[] arr) { if(arr == null || arr.length < 2) { return; }

快速排序、程式碼實現(python3版)及其時間空間複雜分析

快速排序是對氣泡排序的一種改進。基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按次方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。最壞情況的時間複雜度為O(n2),最好情況時間複雜度

排序演算法之 歸併排序 及其時間複雜和空間複雜

        在排序演算法中快速排序的效率是非常高的,但是還有種排序演算法的效率可以與之媲美,那就是歸併排序;歸併排序和快速排序有那麼點異曲同工之妙,快速排序:是先把陣列粗略的排序成兩個子陣列,然後遞迴再粗略分兩個子陣列,直到子數組裡面只有一個元素,那麼就自然排好序了,可

另闢蹊徑的歸併排序複雜分析

筆者,特別地對歸併排序的 複雜度 進行了分析;看了好多部落格,只是簡單的說了下結論,結論怎麼來的,根本不去分析,寫部落格跟沒寫似的,,更氣人的是,還有抄書的,書上寫啥,部落格就寫啥,浪費時間,這種部落格,寫的人、看的人,時間都被浪費了; 目錄

排序及其時間空間複雜分析

    /*      * 堆排序      * 一個建立堆的函式,一個排序的函式      * heap初始建堆(大根堆),取得左右孩子中最大的結點,用其和根節點交換,      * 然後以此孩子結點繼續建堆      * heapSort 堆排序,先從非葉節點到跟進行迴圈

快速排序歸併排序的時間複雜分析——通俗易懂

# 一、前言   今天面試的時候,被問到歸併排序的時間複雜度,這個大家都知道是``O(nlogn)``,但是面試官又繼續問,怎麼推匯出來的。這我就有點懵了,因為之前確實沒有去真正理解這個時間複雜度是如何得出的,於是就隨便答了一波(理解了之後,發現面試的時候答錯了......)。 &em

常見排序演算法的基本原理、程式碼實現和時間複雜分析

  排序演算法無論是在實際應用還是在工作面試中,都扮演著十分重要的角色。最近剛好在學習演算法導論,所以在這裡對常見的一些排序演算法的基本原理、程式碼實現和時間複雜度分析做一些總結 ,也算是對自己知識的鞏固。 說明: 1.本文所有的結果均按照非降序排列; 2.本文所有的程式均用c++實現,

資料結構與演算法--蠻力法之氣泡排序與時間複雜分析(java)

蠻力法         蠻力法又稱窮舉法和列舉法,是一種簡單直接地解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。但是蠻力法所設計的演算法時間特性往往是比較低的,典型的指數時間演算法一般都是通過蠻力

排序的JAVA實現及時間複雜分析

堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有