一.計數排序(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.過程 假設待排序的一組數統一的分布在乙個範圍中,並將這一範圍劃分成幾個子範圍,也就是桶 將待排序的一組數,分檔規入這些子桶,並將桶中的資料進行排序 將...