計數排序 基數排序

2021-06-10 01:40:31 字數 1435 閱讀 5310

一.計數排序(counting sort)

基本思想:對每乙個輸入元素x,確定出小於x的元素個數。

適用範圍:適用於輸入是由小範圍的整數構成的序列。

穩定性:演算法是穩定的。

具體實現:

#include using namespace std;

// arr--初始輸入陣列, res--存放排序結果的陣列,hash臨時儲存區[0...k]

int arr[100], res[100], hash[100];

int len, k = -1;

void printhash()

void countingsort()}/*

思考這裡為何從i=len開始?而不從i=1開始?

保持排序後結果的穩定性!

因為同乙個元素,靠後的元素在排序後相對也是從後開始存入結果陣列的。*/

int main()

countingsort();

cout << "排序後結果為: " << endl;

for(int i=1; i<=len; ++i)

cout << res[i] << " ";

cout << endl;

}

輸出結果:

二.基數排序(radix sort)

基本思想:按組成關鍵字的各個位的值來實現排序的。

排序方式:

排序方式:lsd 由右向左排; msd 由左向右排

穩定性:演算法是穩定的。

推薦:嚴蔚敏《資料結構》上的基數排序。

先說下什麼是基數:計算的基數就是基本的單元數。比如10進製的基數就是10,二進位制的基數就2,八進位制的基數是8等等。

基數排序說通俗點,就是把帶排序的n個數字右對齊排成一列。然後把相同的位數互相比較,來排序。

例圖:以下是具體實現和分析:

#include #include using namespace std;

int arr[100], res[100], hash[10];

int n;

int maxbit()

if(_max < tt)

_max = tt;

}cout << "_max : " << _max << endl;

return _max;}

void radixsort()

for(int j=0; j> n;

cout << "輸入" << n << "個元素: " << endl;

for(int i=0; i> arr[i];

radixsort();

cout << "排序後結果為: " << endl;

for(int i=0; i

cout << res[i] << " ";

cout << endl;

}

桶排序 基數排序 計數基數排序 Java

前面已經講述了很多排序演算法,但是他們的排序演算法都是基於兩個值之間的比較,通過決策樹的方法可以證明深度為d的二叉樹則最多有 一些好的排序演算法是可以達到時間複雜度是線性的,桶排序就是其中一種。比如有n個數,但是這些數的最大數不超過m。這個時候就可以定義乙個含有m個元素的陣列 初始值為0 然後遍歷n...

計數排序和基數排序

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

桶排序 基數排序 計數排序

桶排序 1.原理 將需要排序的陣列分在有限的桶裡 然後對每個桶中的數分別排序 對每個桶的操作 1.別的排序演算法 2.以遞迴的方式繼續使用桶排序 2.過程 假設待排序的一組數統一的分布在乙個範圍中,並將這一範圍劃分成幾個子範圍,也就是桶 將待排序的一組數,分檔規入這些子桶,並將桶中的資料進行排序 將...