排序五 歸併排序和基數排序

2021-10-08 07:43:42 字數 2303 閱讀 1821

歸併排序是另一類不同的排序方法,這種方法是運用分治法解決問題的典型範例。 歸併排序的基本思想是基於合併操作,即合併兩個已經有序的序列是容易的,不論這兩個序列是順序儲存還是鏈式儲存,合併操作都可以在 ο(m+n)時間內完成(假設兩個有序表的長度分別為 m 和 n)。為此,由分治法的一般設計步驟得到歸併排序的過程為:

劃分:將待排序的序列劃分為大小相等(或大致相等)的兩個子串行;

治理:當子串行的規模大於 1 時,遞迴排序子串行,如果子串行規模為 1 則成為有

序序列;

組合:將兩個有序的子串行合併為乙個有序序列。

下圖顯示了歸併演算法的執行過程。假設待排序序列為,如圖所示,歸併排序導致了一系列遞迴的呼叫,而這一系列呼叫過程可以由乙個二叉樹來表示。樹中每個結點由兩個序列組成,上端為該結點所表示的遞迴呼叫的輸入,而下端為相應遞迴呼叫的輸出。樹中的邊用表示遞迴呼叫方向的兩條邊取代,邊上的序號表示各個遞迴呼叫發生的次序。

歸併排序中乙個核心的操作是將乙個序列中前後兩個相鄰的子串行合併為乙個有序序列。完整**如下:

public

class

mergesort

}private

void

merge

(int

a,int left,

int middle,

int right)

else

}//如果左邊還有資料需要拷貝,把左邊陣列剩下的拷貝到新陣列

while

(left<=middle)

//如果右邊還有資料......

while

(rightstart<=right)

while

(tmp<=right)

}public

static

void

main

(string[

] args)

; mergesort.

mergesort

(a,0

, a.length-1)

;//呼叫歸併排序方法

}}

演算法 merge 的時間複雜度為θ(n)。因為假設待合併的兩個子串行總長為 n,則這 n 個元素在從陣列 a 移動到 b 的過程中,每個元素移動一次,而每次元素移動最多隻需要一次比較;最後從陣列 b 移回 a 也只需要 n 次移動操作即可,因此,演算法 merge 的時間複雜度為θ(n)。

基數排序是一種「低位優先」的排序方法,它的基本思想是通過反覆的對子關鍵字排序來完成排序。假設元素r[i]的關鍵字為keyi,keyi是由d位十進位制數組成,即keyi=ki1 ki2… kid,則每一位可以視為乙個子關鍵字,其中ki1是最高位,kid是最低位,每一位的值都在 0 到 9的範圍內,此時基數rd =10。如果ki1是由d個英文本母組成,即keyi=ki1 ki2… kid,其中』a』≤ kij≤』z』(1≤ j ≤d),則基數rd = 26。 排序時先按最低位的值對元素進行初步排序,在此基礎上再按次低位的值進行進一步排序。依次類推,由低位到高位,每一趟都是在前一趟的基礎上,根據關鍵字的某一位對所有元素進行排序,直到最高位,這樣就完成了計數排序的全過程。

下面我們先通過乙個例子來說明基數排序的基本過程。假設對 7 個元素進行排序,每個元素的關鍵字是 1000 以下的正整數。在此,每個關鍵字由三位子關鍵字構成k1 k2 k3,k1代表關鍵字的百位,k2代表關鍵字的十位,k3代表關鍵字的個位,基數rd = 10。排序的過程如圖所示:

基數排序**如下:

public

class

basicsort

}int times =0;

//獲取最大值位數

while

(max>0)

list

queue =

newarraylist

();//多維陣列

for(

int i =

0;i<

10;i++

)for

(int i =

0;i)//開始收集

int count =0;

for(

int j =

0;j<

10;j++)}

}}public

static

void

main

(string[

] args)

; basicsort.

sort

(a);

}}

歸併排序和基數排序

空間複雜度 o n o n o n 時間複雜度 o n log2 n o nlog 2n o nlog 2 n 穩定性 穩定 適用於順序儲存和鏈式儲存 typedef int elemtype 合併兩個相鄰的有序線性表 void merge elemtype a,int low,int mid,in...

排序之歸併排序和基數排序

void mergesort int arr,int copy,int left,int right left 0,right n 1 int mid left right 2 mergesort arr,copy,left,mid 不斷遞迴將其劃分成最小的部分存進copy中,再讓mid兩邊的資料進...

11 歸併排序和基數排序

核心思想 拆分和合併,拆分其實只幹了一件事將陣列2等份,一直拆分到無法拆分為止,合併在於從最小拆分單元先排序,然後向上合併再排序,最終得到乙個有序陣列。分支演算法採用的遞迴操作,核心 在於合併。public class mergesort int temp newint arr.length mer...