大多數據結構書中,排序這一章的內容基本上都是直接插入排序、折半插入排序、直接選擇排序、起泡排序、堆排序、快速排序、歸併排序、基數排序。這幾種排序方法中,最好的算法的空間複雜度除了快速排序外都是O(1),平均時間複雜度最小爲O(nlogn).
前幾天看到下面幾個有效的排序方法,粗略分析下其性能。
鴿巢排序
鴿巢排序的基本思想是:
假設我們要排序的數組爲init_array,設其中最大元素爲Max。額外分配一個長度爲Max的int類型數組temp[Max],數組中元素初始都爲0,算法開始循環地將temp中下標爲init_array[i]處的元素置一個常數a(假設爲1);然後從0開始掃描數組init_array,遇到temp中值爲這個常數a的元素時,將其依次存入數組init_array中,此時init_array中存儲的就是已排序的元素。
整個程序的實現如下所示:
這個算法的時間複雜度爲O(Max),因爲算法的第二次for循環中若把常數設置爲1的話實際只執行1次,可用if(b[i]==1)代替。空間複雜度也爲O(Max),因爲另外開闢了Max的空間。
鴿巢排序算法的限制條件有兩個:一是數組中存儲的必須是int類型或者轉換爲int類型不丟失真實數據的數據類型;二是必須事先預測到數組中存儲的最大元素,在程序運行過程中求得後因爲不是const值,所以無法用int b[Max] = {0};來初始化數組b.