總結一下常見的幾種排序

2021-07-13 18:50:52 字數 1435 閱讀 2898

1、插入排序

public void 

insertsort(int a)

}}

時間複雜度o(n^2),沒有多餘的空間開銷,雖然複雜度為平方級別,但在陣列為近似有序的情況下效率非常高,有時在歸併和快排的的子串行中可以使用插入排序,一般能提公升20%-30%的效率。

2、希爾排序

希爾排序可以理解為插入排序的改進,大概思想是不斷迴圈把陣列根據間隔進行部分排序,直至間隔為1,這樣做充分利用了插入排序對近似有序陣列排序的高效特點,效率比插入排序提高70%-80%。

public void 

hillsort(int a)

while(h>=1)}}

h/=3;}

}

這裡的間隔取值是按《algorithms》書中取得,一般來說這樣的間隔取值能達到最優速度。

3、快速排序

快排的理論最差時間複雜度為o(n^2),但實際執行速度還是很快的,平均效率為o(nlgn),通過隨機化key值基本可以規避掉最壞情況。筆者認為快排是一種很優秀的排序,內迴圈極為精簡,比較次數很少,通過隨機化快排切分陣列的效果也很好。

public void 

quicksort(int a,int begin,int end)

}swap(a,begin,key);

quicksort(a,begin,key-1);

quicksort(a,key+1

,end);

}

4、歸併排序

歸併排序的理論時間複雜度應該是排序中最優秀的了,但實際執行中其實速度卻不是最快的,因為歸併排序的**操作非常多,因此效能並不像理論上表現的那麼優秀,還有乙個問題是歸併排序需要額外的空間複雜度,與陣列長度成正比,因此也要根據實際情況選擇。

public void 

mergesort(int a,int begin,int end)

public void

merge(int a,int begin,int mid,int end)

else

}while(i<=mid)

while(j<=end)

for(int m=0

;mlength

;m++)

}

5、堆排序

二叉堆的維護分為插入和刪除兩種情況,即上浮和下沉兩種操作,如果只是用堆排序的話只用到下沉就可以了,堆排序是目前所知能夠同時最優的利用空間和時間的方法,它的缺點也很明顯,無法利用快取,因為很少與相鄰的其他元素進行比較,因此快取未命中的概率遠高於快速排序、歸併排序等排序。

public void 

heapsort(int a)

int n=length-1

;while(n>0)

}public void

sink(int a,int k,int n)

}

幾種濾波演算法,總結一下

最近在做武術擂台,發現對於紅外測距感測器的返回值速度很快,但是誤差值很大,經過簡單函式調校之後,發現還是有誤差,有干擾資料,於是匯入了math.h,進行的絕對值濾波,但是用迴圈暫存了十組資料,進行簡單的加權演算法,發現還是不行,於是去找了一些經典的濾波演算法,算是簡單記錄一下。分享給大家。1 限幅濾...

回顧一下經典的幾種排序問題

直接放 好了,還是要多動手試一下才印象深一點 include 氣泡排序 void bubblesort int a,int len 時間複雜度o n 插入排序 void insertsort int a,int len 插入排序 找到前面比自己大的數,進行位置交換 時間複雜度 n a j temp ...

總結一下快速排序演算法

使用快速排序演算法將陣列中的數從小到大排序 先取陣列第乙個數作為key,陣列第乙個位置為first,陣列最後乙個元素作為last,last先和key比較,如果比key小,就把last放到first的位置。如果比key大,那麼last將減一,直到last的位置所在的數比key小,然後把last所在的位...