几种排序算法的思想
一、冒泡排序
已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大于a[2]則交換兩者的值,否則不變。再比較a[2]與a[3]的值,若a[2]大于a[3]則交換兩者的值,否則不變。再比較a[3]與a[4],依此類推,最后比較a[n-1]與a[n]的值。這樣處理一輪后,a[n]的值一定是這組數據中最大的。再對a[1]~a[n-1]以相同方法處理一輪,則a[n-1]的值一定是a[1]~a[n-1]中最大的。再對a[1]~a[n-2]以相同方法處理一輪,依此類推。共處理n-1輪后a[1]、a[2]、……a[n]就以升序排列了。
優點:穩定,比較次數已知;
缺點:慢,每次只能移動相鄰兩個數據,移動數據的次數多。
二、選擇排序
已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先比較a[1]與a[2]的值,若a[1]大于a[2]則交換兩者的值,否則不變。再比較a[1]與a[3]的值,若a[1]大于a[3]則交換兩者的值,否則不變。再比較a[1]與a[4],依此類推,最后比較a[1]與a[n]的值。這樣處理一輪后,a[1]的值一定是這組數據中最小的。再將a[2]與a[3]~a[n]以相同方法比較一輪,則a[2]的值一定是a[2]~a[n]中最小的。再將a[3]與a[4]~a[n]以相同方法比較一輪,依此類推。共處理n-1輪后a[1]、a[2]、……a[n]就以升序排列了。
優點:穩定,比較次數與冒泡排序一樣,數據移動次數比冒泡排序少;
缺點:相對之下還是慢。
三、插入排序
已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、b[2]、……b[m],需將二者合并成一個升序數列。首先比較b[1]與a[1]的值,若b[1]大于a[1],則跳過,比較b[1]與a[2]的值,若b[1]仍然大于a[2],則繼續跳過,直到b[1]小于a數組中某一數據a[x],則將a[x]~a[n]分別向后移動一位,將b[1]插入到原來a[x]的位置這就完成了b[1]的插入。b[2]~b[m]用相同方法插入。(若無數組a,可將b[1]當作n=1的數組a)
優點:穩定,快;
缺點:比較次數不一定,比較次數越少,插入點后的數據移動越多,特別是當數據總量龐大的時候,但用鏈表可以解決這個問題。
四、縮小增量排序
由希爾在1959年提出,又稱希爾排序。
已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。發現當n不大是,插入排序的效果很好。首先取一增量d(d<n),將a[1]、a[1+d]、a[1+2d]……列為第一組,a[2]、a[2+d]、a[2+2d]……列為第二組……,a[d]、a[2d]、a[3d]……列為最后一組依此類推,在各組內用插入排序,然后取d'<d,重復上述操作,直到d=1。
優點:快,數據移動少;
缺點:不穩定,d的取值是多少,應取多少個不同的值,都無法確切知道,只能憑經驗來取。
五、快速排序
快速排序是冒泡排序的改進版,是目前已知的最快的排序方法。
已知一組無序數據a[1]、a[2]、……a[n],需將其按升序排列。首先任取數據a[x]作為基準。比較a[x]與其它數據并排序,使a[x]排在數據的第k位,并且使a[1]~a[k-1]中的每一個數據<a[x],a[k+1]~a[n]中的每一個數據>a[x],然后采用分治的策略分別對a[1]~a[k-1]和a[k+1]~a[n]兩組數據進行快速排序。
優點:極快,數據移動少;
缺點:不穩定。
經過一段時間的學習和編程,我已對上述幾種排序方法熟練掌握或有所了解。在此基礎上,經過我的思考和實踐,我研究出了一種新的排序算法:分段插入排序。
分段插入排序
已知一組升序排列數據a[1]、a[2]、……a[n],一組無序數據b[1]、b[2]、……b[m],需將二者合并成一個升序數列。先將數組a分成x等份(x<<n),每等份有n/x個數據。將每一段的第一個數據先儲存在數組c中:c[1]、c[2]、……c[x]。運用插入排序處理數組b中的數據。插入時b先與c比較,確定了b在a中的哪一段之后,再到a中相應的段中插入b。隨著數據的插入,a中每一段的長度會有變化,所以在每次插入后,都要檢測一下每段數據的量的標準差s,當其大于某一值時,將a重新分段。在數據量特別巨大時,可在a中的每一段中分子段,b先和主段的首數據比較,再和子段的首數據比較,可提高速度。
優點:快,比較次數少;
缺點:不適用于較少數據的排序,s的臨界值無法確切獲知,只能憑經驗取。
我設計的算法或許優于某些算法,但它也有它的優點、缺點和適用范圍。不僅排序算法如此,任何算法都一樣。沒有任何一個人干說自己的算法是最好的。設計新算法的過程其實就是增加其優點,減少其缺點和拓寬其適用范圍的過程。我最崇尚的一句話就是:“沒有最好,只有更好。”
總結
- 上一篇: HashMap与加载因子/负载因子loa
- 下一篇: ContentValues和HashTa