演算法 統計排序(桶排序)

2022-07-28 14:09:32 字數 1032 閱讀 3000

看了一道筆試題,說有100w個資料,範圍在0~65535之間,要求用最少的空間和最快的速度進行排序。

剛開始的思路是,65535就是2^16,那首先要把資料型別定義為short。其次,要用最少的空間,那最好還是不用遞迴,那不用快排。不遞迴,速度又快,那肯定是堆排序了。o(n)的空間+o(nlogn)的時間。

後來看了網上的人對於這題的評點,原來統計排序才是這一條件下的最優解。

統計排序,又叫桶排序。它的原理非常簡單。在知道資料大小範圍的條件下,定義乙個等於資料大小範圍的陣列。陣列初始化為0,然後直接用資料作為陣列下標統計資料個數,最後把統計資料從頭到尾輸出(公升序),或者從尾到頭輸出(降序)即可。時間複雜度為o(n)。

因此,當題目有以下特點時,考慮統計排序:1、資料範圍確定 2、資料範圍小於資料個數

考慮題目條件,2^16 < 100w=2^20 < 2^32 (unsigned int範圍),因此定義乙個長為65535的陣列做統計。

unsigned short

value;

unsigned

int array[65536];

memset(array,

0, sizeof

(array));

while (get_value(&value))

有的題目可能沒有明確給出資料的範圍,但其實已經隱含給出了。例如:給出乙個包含數字與字母的字串,要求字母位置不變,對數字排序。題目隱含了數字的大小是0~9,因此使用統計排序做就非常簡單了。

void sortstr( char *str);

int j=0

;

while(str[j]!='\0'

) j++;

}j=0

;

int i=0

;

while(str[j]!='\0'

)

if(i<10

) }

j++;

}cout

}

排序方法統計

1 氣泡排序 相鄰元素之間逐對兩兩比較,若不符合預期則先交換位置再繼續比較,如此,每次比較都能把最大或最小的元素放在預期位置,直到完成排序。氣泡排序 public static int popsort int array else continue return arr 2 快速排序 2 同時從數字...

排序演算法 桶排序

桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序並不...

排序演算法 桶排序

2009 12 02 12 01 2817人閱讀 桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均...