基數排序和堆排序

2021-10-23 14:29:06 字數 3519 閱讀 3668

堆排序基數排序(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 基數排序法是屬於穩定性的排序,基數...

計數排序和基數排序

計數排序和基數排序是屬於線性級時間複雜度的排序方式,雖然沒有冒泡,選擇,快排演算法那些讓人廣為所知,但是這兩種排序方式在某些場合非常適用。計數排序是基數排序的基礎,最為關鍵的是 基數排序演算法是字尾陣列的關鍵 當然字尾陣列也可以用快排 字尾陣列是用於處理字串的一種非常優秀的資料結構,可以高效的處理很...