大多資料結構書中,排序這一章的內容基本上都是直接插入排序、折半插入排序、直接選擇排序、起泡排序、堆排序、快速排序、歸併排序、基數排序。這幾種排序方法中,最好的演算法的空間複雜度除了快速排序外都是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] = ;來初始化陣列b.
資料結構 排序 各種排序演算法全分析
資料結構 排序 各種排序演算法全分析 排序簡介 排序是資料處理中經常使用的一種重要運算,在計算機及其應用系統中,花費在排序上的時間在系統執行時間中占有很大比重 並且排序本身對推動演算法分析的發展也起很大作用。目前已有上百種排序方法,但尚未有乙個最理想的盡如人意的方法,本章介紹常用的如下排序方法,並對...
資料結構 排序演算法 分析(Java篇)
上學期學了資料結構這門課,感覺上的太水了,自己再來重溫一遍.一 插入排序 public static void insertsort int a 時間複雜度o n2 因為內迴圈中元素的比較次數對於p的每個值最多是p 1次。二 希爾排序 public static void shellsort int...
資料結構 演算法分析
1 冒泡法 冒泡法大家都較熟悉。其原理為從a 0 開始,依次將其和後面的元素比較,若a 0 a i 則交換它們,一直比較到a n 同理對a 1 a 2 a n 1 處理,即完成排序。voidbubble int a,intn 定義兩個引數 陣列首位址與陣列大小 冒泡法原理簡單,但其缺點是交換次數多,...