1、插入排序
public void時間複雜度o(n^2),沒有多餘的空間開銷,雖然複雜度為平方級別,但在陣列為近似有序的情況下效率非常高,有時在歸併和快排的的子串行中可以使用插入排序,一般能提公升20%-30%的效率。insertsort(int a)
}}
2、希爾排序
希爾排序可以理解為插入排序的改進,大概思想是不斷迴圈把陣列根據間隔進行部分排序,直至間隔為1,這樣做充分利用了插入排序對近似有序陣列排序的高效特點,效率比插入排序提高70%-80%。
public void這裡的間隔取值是按《algorithms》書中取得,一般來說這樣的間隔取值能達到最優速度。hillsort(int a)
while(h>=1)}}
h/=3;}
}
3、快速排序
快排的理論最差時間複雜度為o(n^2),但實際執行速度還是很快的,平均效率為o(nlgn),通過隨機化key值基本可以規避掉最壞情況。筆者認為快排是一種很優秀的排序,內迴圈極為精簡,比較次數很少,通過隨機化快排切分陣列的效果也很好。
public void4、歸併排序quicksort(int a,int begin,int end)
}swap(a,begin,key);
quicksort(a,begin,key-1);
quicksort(a,key+1
,end);
}
歸併排序的理論時間複雜度應該是排序中最優秀的了,但實際執行中其實速度卻不是最快的,因為歸併排序的**操作非常多,因此效能並不像理論上表現的那麼優秀,還有乙個問題是歸併排序需要額外的空間複雜度,與陣列長度成正比,因此也要根據實際情況選擇。
public void5、堆排序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++)
}
二叉堆的維護分為插入和刪除兩種情況,即上浮和下沉兩種操作,如果只是用堆排序的話只用到下沉就可以了,堆排序是目前所知能夠同時最優的利用空間和時間的方法,它的缺點也很明顯,無法利用快取,因為很少與相鄰的其他元素進行比較,因此快取未命中的概率遠高於快速排序、歸併排序等排序。
public voidheapsort(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所在的位...