堆排序基數排序(radix sort)屬於「分配式排序」(distribution sort),又稱「桶子法」(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些「桶」中,藉以達到排序的作用,基數排序法是屬於穩定性的排序。
時間複雜度為o (nlog®m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。
11,45,73,55,98,27,49,81,33
首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:
01 11 81
23 73 33
45 45 55
67 27
8 98
9 49
接下來將這些桶子中的數值重新串接起來,成為以下的數列:
11 81 73 33 45 55 27 98 49
接著再進行一次分配,這次是根據十位數來分配:
01 11
2 27
3 33
4 45 49
5 55
67 73
8 81
9 98
最後將這些桶子中的數值重新串接起來,成為以下的數列:
11,27,33,45,49,55,73,81,98
// a code block
var foo = 'bar';
// an highlighted block
1public
class
radixsort
;// 本例項中的最大數是百位數,所以只要到100就可以了
6return
((x / a[d])%
10);7
}89public
void
radixsort
(int[
] list, int begin, int end, int digit)
20// 統計各個桶將要裝入的資料個數
21for
(i = begin; i <= end; i++)25
// count[i]表示第i個桶的右邊界索引
26for
(i =
1; i < radix; i++)29
// 將資料依次裝入桶中
30// 這裡要從右向左掃瞄,保證排序穩定性
31for
(i = end; i >= begin; i--)38
// 將已分配好的桶中資料再倒出來,此時已是對應當前位數有序的表
39for
(i = begin, j =
0; i <= end; i++
, j++)42
}43}44
45public int[
]sort
(int[
] list)
4950
// 列印完整序列
51public
void
printall
(int[
] list)
55 system.out.
println()
;56}57
58public
static
void
main
(string[
] args)
;60 radixsort radix =
newradixsort()
;61 system.out.
print
("排序前:\t\t");
62 radix.
printall
(array)
;63 radix.
sort
(array)
;64 system.out.
print
("排序後:\t\t");
65 radix.
printall
(array);66
}67}1 排序前:
50123
543187
493002
11100
2 排序後:02
1130
4950
100123
187543
堆排序是利用堆這種資料結構而設計的一種排序演算法,堆排序是一種選擇排序,
堆排序的基本思想是:將待排序序列構造成乙個大頂堆,此時,整個序列的最大值就是堆頂的根節點。
將其與末尾元素進行交換,此時末尾就為最大值。然後將剩餘n-1個元素重新構造成乙個堆
,這樣會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了
簡單總結:
a.將無序序列構建成乙個堆,根據公升序降序需求選擇大頂堆或小頂堆;
b.將堆頂元素與末尾元素交換,將最大元素"沉"到陣列末端;
c.重新調整結構,使其滿足堆定義,然後繼續交換堆頂元素與當前末尾元素,反覆執行調整+交換步驟,直到整個序列有序。
它的最壞,最好,平均時間複雜度均為o(nlogn),它是不穩定排序
// a code block
var foo = 'bar';
// an highlighted block
public
class
heapsort
;sort
(arr)
; system.out.
println
(arrays.
tostring
(arr));
}public
static
void
sort
(int [
]arr)
//2.調整堆結構+交換堆頂元素與末尾元素
for(int j=arr.length-
1;j>
0;j--)}
/** * 調整大頂堆(僅是調整過程,建立在大頂堆已構建的基礎上)
* @param arr
* @param i
* @param length
*/public
static
void
adjustheap
(int [
]arr,int i,int length)
if(arr[k]
>temp)
else
} arr[i]
= temp;
//將temp值放到最終的位置
}/**
* 交換元素
* @param arr
* @param a
* @param b
*/public
static
void
swap
(int [
]arr,int a ,int b)
}
排序 基數排序
基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...
排序 基數排序
1 基數排序 桶排序 介紹 1 基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是通過鍵值的各個位的值,將要排序的元素分配至某些 桶 中,達到排序的作用 2 基數排序法是屬於穩定性的排序,基數...
計數排序和基數排序
計數排序和基數排序是屬於線性級時間複雜度的排序方式,雖然沒有冒泡,選擇,快排演算法那些讓人廣為所知,但是這兩種排序方式在某些場合非常適用。計數排序是基數排序的基礎,最為關鍵的是 基數排序演算法是字尾陣列的關鍵 當然字尾陣列也可以用快排 字尾陣列是用於處理字串的一種非常優秀的資料結構,可以高效的處理很...