计数排序,基数排序,桶排序
生活随笔
收集整理的這篇文章主要介紹了
计数排序,基数排序,桶排序
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉?http://blog.163.com/yuyang_tech/blog/static/216050083201382055821953/
與合并排序,堆排序,快速排序等基于比較的排序算法不同,計數排序,以及基數排序、桶排序是用非比較的一些操作來確定排序順序的,計數排序、基數排序、桶排序是三種以線性時間運行的算法。
計數排序: 計數排序假設n個輸入元素中的每一個都是介于0到k之間的整數,即輸入的數據是具有上界的整數。 計數排序的基本思想就是對每一個輸入元素x,確定出小于x的元素個數。有了這一信息,就可以把x直接放到它的最終輸出數組中的位置上。例如,如果有17個元素小于x,則x就輸入第18個輸出位置。 下面為計數排序的代碼: //CountingSort.cpp void CountingSort(int arrSrc[],int arrDst[],int arrLength,int upperLimit) { int* arrCount = new int[upperLimit+1]; for(int i=0;i<=upperLimit;i++)//初始化arrCount arrCount[i] = 0; for(int i=0;i<arrLength;i++)//arrCount[i]記錄arrSrc[]中等于i的元素個數 arrCount[arrSrc[i]] += 1; for(int i=1;i<=upperLimit;i++)//arrCount[i]記錄arrSrc[]中小于等于i的元素個數 arrCount[i] += arrCount[i-1]; for(int i=arrLength-1;i>=0;i--) { arrDst[arrCount[arrSrc[i]]-1] = arrSrc[i]; arrCount[arrSrc[i]] -= 1; } delete []arrCount; } 一個調用的實例:? #include <iostream> #include <stdlib.h> using namespace std; void CountingSort(int arrSrc[],int arrDst[],int arrLength,int upperLimit); void main() { int arrLength = 10; int upperLimit = 50; int* a = new int[arrLength]; for(int i=0;i<arrLength;i++) a[i]= rand()%(upperLimit+1); for(int i=0;i<arrLength;i++) cout << a[i] <<" ?"; cout << endl; int* b = new int[arrLength]; CountingSort(a,b,arrLength,upperLimit); for(int i=0;i<arrLength;i++) cout << b[i] <<" ?"; cout << endl; delete []b; }
?
基數排序: 基數排序首先從最低有效位數字進行排序,然后重復這個過程,直到最高有效位數字排序完畢。一個實例如圖所示。 在基數排序中,最重要的一點是 按位排序 使用的算法一定要是穩定的。 在常見的排序算法中,選擇排序、快速排序、希爾排序、堆排序不是穩定的排序算法,而冒泡排序、插入排序、合并排序是穩定的排序算法。當然,基數排序也是穩定的。(參考) 桶排序:(參考百度百科) 桶排序也是基于一定的假設。假定:輸入是由一個隨機過程產生的[0, 1)區間上均勻分布的實數。將區間[0, 1)劃分為n個大小相等的子區間(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…將n個輸入元素分配到這些桶中,對桶中元素進行排序,然后依次連接桶輸入0 ≤A[1..n] <1輔助數組B[0..n-1]是一指針數組,指向桶(鏈表)。 在桶排序算法的代碼中,假設輸入是含n個元素的數組A,且每個元素滿足0≤ A[i]<1。另外還需要一個輔助數組B[O..n-1]來存放鏈表實現的桶,并假設可以用某種機制來維護這些表。 桶排序的算法如下(偽代碼表示),其中floor(x)是地板函數,表示不超過x的最大整數。 procedure Bin_Sort(var A:List); begin n:=length(A); for i:=1 to n do 將A[i]插到表B[floor(n*A[i])]中; for i:=0 to n-1 do 用插入排序對表B[i]進行排序; 將表B[0],B[1],...,B[n-1]按順序合并; end; 下圖演示了桶排序作用于有10個數的輸入數組上的操作過程。(a)輸入數組A[1..10]。(b)在該算法的第5行后的有序表(桶)數組B[0..9]。桶i中存放了區間[i/10,(i+1)/10]上的值。排序輸出由表B[O]、B[1]、...、B[9]的按序并置構成。總結
以上是生活随笔為你收集整理的计数排序,基数排序,桶排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 理解并演示:Root Guard(根保护
- 下一篇: Cordova探险系列(一个)