常見的排序演算法示例(3) 歸併排序 堆排序

2021-07-30 18:10:06 字數 2607 閱讀 1668

一、歸併排序演算法

基本思想:

歸併(merge)排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。

歸併排序示例:

合併方法:

設r[i…n]由兩個有序子表r[i…m]和r[m+1…n]組成,兩個子表長度分別為n-i +1、n-m。

j=m+1;k=i;i=i; //置兩個子表的起始下標及輔助陣列的起始下標

若i>m 或j>n,轉⑷ //其中乙個子表已合併完,比較選取結束

//選取r[i]和r[j]較小的存入輔助陣列rf

如果r[i]

//將尚未處理完的子表中元素存入rf

如果i<=m,將r[i…m]存入rf[k…n] //前一子表非空

如果j<=n ,  將r[j…n] 存入rf[k…n] //後一子表非空

合併結束。

演算法實現:

/**

* 歸併排序

* 簡介:將兩個(或兩個以上)有序表合併成乙個新的有序表 即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列

* 時間複雜度為o(nlogn)

* 穩定排序方式

* @param

nums 待排序陣列

* @return

輸出有序陣列

*/public

static

int sort(int nums, int low, int

high)

return

nums;

}/*** 將陣列中low到high位置的數進行排序

* @param

nums 待排序陣列

* @param

low 待排的開始位置

* @param

mid 待排中間位置

* @param

high 待排結束位置

*/public

static

void merge(int nums, int low, int mid, int

high)

else

}//把左邊剩餘的數移入陣列

while (i <=mid)

//把右邊邊剩餘的數移入陣列

while (j <=high)

//把新陣列中的數覆蓋nums陣列

for (int k2 = 0; k2 < temp.length; k2++)

}

二、堆排序演算法1、基本思想:堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

堆的定義下:具有n個元素的序列 (h1,h2,...,hn),當且僅當滿足(hi>=h2i,hi>=2i+1)或(hi<=h2i,hi<=2i+1) (i=1,2,...,n/2)時稱之為堆。在這裡只討論滿足前者條件的堆。由堆的定義可以看出,堆頂元素(即第乙個元素)必為最大項(大頂堆)。完全二 叉樹可以很直觀地表示堆的結構。堆頂為根,其它為左子樹、右子樹。

思想:初始時把要排序的數的序列看作是一棵順序儲存的二叉樹,調整它們的儲存序,使之成為乙個 堆,這時堆的根節點的數最大。然後將根節點與堆的最後乙個節點交換。然後對前面(n-1)個數重新調整使之成為堆。依此類推,直到只有兩個節點的堆,並對 它們作交換,最後得到有n個節點的有序序列。從演算法描述來看,堆排序需要兩個過程,一是建立堆,二是堆頂與堆的最後乙個元素交換位置。所以堆排序有兩個函式組成。一是建堆的滲透函式,二是反覆呼叫滲透函式實現排序的函式。

2、例項

初始序列:46,79,56,38,40,84

建堆:

交換,從堆中踢出最大數

依次類推:最後堆中剩餘的最後兩個結點交換,踢出乙個,排序完成。

3.演算法實現:

public

class

heapsort ;

int arraylength=a.length;

//迴圈建堆

for(int i=0;i)

}//對data陣列從0到lastindex建大頂堆

public

static

void buildmaxheap(int data, int

lastindex)

} //如果k節點的值小於其較大的子節點的值

if(data[k]

else}}

}//交換

private

static

void swap(int data, int i, int

j)

}

常見排序演算法總結 3 歸併排序

3 歸併排序 將陣列不斷拆分,拆分為多個只包含單個元素的陣列。再將陣列不斷有序合併,合併為乙個有序的陣列。遞迴 合併簡稱歸併,合併都能理解,那什麼是遞迴呢,遞迴其實就是在一次大規模運算中,其中的一步或幾步計算用到了前面的運算結果,舉個例子 第一天給你一塊錢,第二天給你兩塊錢,第三天四塊,以此類推每天...

排序演算法 3 歸併排序

這篇博文分為四個部分 歸併排序基本思想 基礎 實現與解析 一次優化 二次優化 自底向上的歸併排序 1.歸併排序基本思想 3 歸併排序 小到大排序 1.迴圈的將每乙個部分都分為原來的一半 直到最後每一部分只剩下乙個元素 2.迴圈的將每兩個部分進行合併並且排序 直到最後全部合併 o n log n 2....

php歸併排序演算法示例

看指標型的歸併演算法好麻煩,自己動手寫乙個,供自己學習用。php 歸併排序演算法示例。這是無指標型的,容易看懂。實際生產應用中,用指標速度更快。輸出如下 start 0 end 1 臨時陣列 array 0 30,1 66,start 2 end 3 臨時陣列 array 0 6,1 45,star...