之前有乙個關於排序方法的總結詳見該篇博文在總結中四種排序方法(計數排序,選擇排序,插入排序和氣泡排序)的複雜度均為o(n^2)。那有沒有排序方法的複雜度是o(n)這個級別的呢?
還真有,最近發現了兩種排序方法—箱子排序和基數排序複雜度都可以達到o(n)級別。並且基數排序是在箱子排序的基礎之上改進的。
箱子排序的一般步驟:1.建立range(排序資料的範圍)個箱子。2.將輸入的無序資料結構逐個刪除並插入到對應的箱子中。3.將每個非空箱子按序連線起來。
實現的c++**如下:
#include
"binsort.h"
//學生的結構體
struct studentrecord
;//箱子排序,就是建立range個箱子,然後將n個資料填進到箱子中,最後將非空的箱子連線起來(range箱子的範圍)
void
binsort
(chain
& thechain,
int range)
//第三步將非空箱子連線起來
for(
int k = range; k >=0;
--k)
}delete
bin;
}int
main()
; chain thechain;
cout<<
"okokok"
int i=
0;i) cout<<
"okokok"
(thechain,
100)
;for
(int j =
0; j size()
;++j)
return0;
}
由於在兩個for迴圈中,每個get,insert和erase引數方法均是0。所以複雜度是o(1)。所以第乙個for迴圈的複雜度是θ(n),第二個for迴圈的時間複雜度是θ(n+range)。這樣總的複雜度就降到了o(n)。
穩定排序:
如果乙個排序方法能夠保持同值元素之間的相對順序,則該方法可以稱作是穩定排序。
箱子排序是穩定排序嗎?是的。
由於下面的**:
//第二步將n個資料放到箱子中去
int size = thechain.
size()
;//獲得n的大小
for(
int j =
0; j < size;
++j)
//第三步將非空箱子連線起來
for(
int k = range; k >=0;
--k)
}
由於都是從0訪問,導致相同的值存時後面的在前面,但是由於從箱子中取出時也是從0取出,這就導致後面的又跑到前面了。兩次這樣的操作正好保持了相同資料的相對次序。
由於箱子排序複雜度是θ(n+range),當range很大時,箱子排序有很大的缺點。比如給10個在1到100000的資料排序,range=100000,而n只等於10.這就導致n^2//
// created by lenovo on 2019/10/21.
//#ifndef raxio_radixsort_h
#define raxio_radixsort_h
#include
using
namespace std;
int data[10]
=;//待排序的陣列
typedef
struct list //靜態鍊錶結構體型別
list;
list bucket[10]
;//構造十個桶
list d[10]
;//將待排序資料構造成list型別的陣列
//計算待排序陣列元數的最長的位數
intmaxbit
(int data,
int n)
// if(c>d)
// d=c;
// }
int max = data[0]
;for
(int i =
0; i < n;
++i)
}while
(max/10)
return d;
}//清桶的過程,以及將臨時的陣列放到d陣列中
void
init
(int data,
int n)
for(j=
0;j//基數排序的過程
void
radiosort
(int data,
int n)
}else
}int c=0;
for(
int k=
0;k)//倒桶的過程,將其放到data陣列當中}}
r=r*10;
//為了後面對十位數以及高位求當前位置上的數字}}
#endif
//raxio_radixsort_hmain方法如下:
#include
#include
"radixsort.h"
using
namespace std;
intmain()
關鍵是:讓同乙個bucket的數字都能儲存下來,便於向更改data中的資料。
d[k]
.next=bucket[b]
.next;
//將重複的數字存到d的相應位置上
bucket[b]
.next=k;
當使用基數r=n對nc-1的範圍內的n個數字進行分解時,每個數可以分解出c個數字,因此對n個數,可以用c次range=n個箱子排序。時間複雜度為θ(cn)= θ(n)。
箱子排序和基數排序均能使排序的時間複雜度達到o(n)優於前面的四種基礎排序方法的o(n^2)。同時可以看到箱子排序和基數排序的實現**和邏輯較難。尤其是基數排序(基數排序的**我看了兩天才看明白。。。。。。。)。但掌握之後可以很好的提高程式效能。
箱子排序(桶排序),基數排序
include include include include circularlistwithheader.h include extendedchain.h include 本演算法為箱子排序的演算法 author zailushang data 2020 06 27 目的為了熟悉c 的雙向鍊錶...
(箱子)桶排序及基數排序
桶排序是基於鍊錶的,相鄰的桶之間和桶中相鄰的元素之間皆用鍊錶相連線,可以把它想象成乙個矩陣。用乙個例子來說明桶排序。假設有乙個鍊錶,其中的元素需要進行排序,元素為abcdefghij,其值依次為2454304344,如a2 b4 c5 d4 e3 f0 g4 h3 i4 j4。若根據值進行排序。首先...
排序 基數排序
基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...