核心思想:拆分和合併,拆分其實只幹了一件事將陣列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兩邊的資料進...