11 歸併排序和基數排序

2021-10-08 08:47:59 字數 2011 閱讀 3627

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

public

class

mergesort;//

int[

] temp =

newint

[arr.length]

;mergesort

(arr,

0, arr.length -

1, temp)

; system.out.

println

(arrays.

tostring

(arr));

}public

static

void

mergesort

(int

arr,

int left,

int right,

int[

] temp)

}/**

* 合併演算法

** @param arr 需要排序的原陣列

* @param left 分支左邊資料的開始下標

* @param mid 分支左邊陣列的結束索引

* @param right 分支資料長度的結束下標

* @param temp 臨時陣列

*/public

static

void

merge

(int

arr,

int left,

int mid,

int right,

int[

] temp)

else

}//把有剩餘資料的一邊的資料依次全部填充到temp

while

(i <= mid)

while

(j <= right)

//將temp陣列的元素拷貝到arr

//注意,並不是每次都拷貝所有

tempindex =0;

int templeft = left;

while

(templeft <= right)

}}

基數排序

核心思想: 一共有0-9為數字的桶,一共10個,一共迴圈陣列中最大數的位數次(如最大數是1000則是4次個十百千位分別迴圈),每一次迴圈依次從數中取出個、十、百、千、萬…位數上的數值放到對應的桶中,如果該位上沒有數字補零,然後依次從0-9桶中取出組成乙個新的臨時陣列作為下一次迴圈的輸入,一直到迴圈到最高位,最後依次得到的結果即是有序。(此法只適合正整數的排序)

public

class

radixsort

;radixsort

(arr);}

/** * 找到陣列中 位數最高的數

** @param arr

* @return

*/public

static

intfindmaxlength

(int

arr)

return

(max +"")

.length()

;}public

static

void

radixsort

(int

arr)

for(

int i =

0; i < bucketcount.length; i++)}

}// 重置統計每個桶中元素個數的bucketcount

bucketcount =

newint[10

];tempindex =0;

system.out.

println

("第"

+ k +

"次迴圈 "

+ arrays.

tostring

(temp));

}}}

歸併排序和基數排序

空間複雜度 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...

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

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

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

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兩邊的資料進...