寫排序演算法總是計算機招聘筆試面試必考,也最檢驗考基礎能力的題~續前一篇介紹其他四種排序演算法
5. 輪輪選拔 の 氣泡排序 (bubble sort)
氣泡排序也是原理比較好懂,但是實現效率不高的排序方法之一,比較適合初學者熟悉理解演算法的過程
「冒泡」本身就是乙個很形象的比喻。在此排序演算法中,每一輪會前後兩兩比較,將較小的數(或較大)前移。遍歷整個陣列後,很容易想到第乙個數就是當前陣列中最小(或最大)的數,很像乙個比較輕的氣泡從水底慢慢上浮~。這樣每輪可以比較巧妙地選出陣列剩下中最小的,最終實現排序
氣泡排序在複雜度上和直接插入排序一樣,前者是每輪「選出」第i小的,而後者則是每輪「處理」第i個。最壞情況和平均情況時間複雜度均是o(n²),最好情況下,即基本有序時為o(n),同時他們也都是穩定的。
void bubblesort(int a,int low,int high)
void mergesort(int a,int b,int low,int high)
while(num!=0);
return count;
}int findmaxnum( int a,int low,int high)
return max;
}//gather numbers into buckets, then put them back
void gatherandput(int a , int low,int high , int loop)
; int i , j ,k ,digitnum = 1;
for(i=1;i**寫的比較粗糙,未經過優化,主要是體現基數排序的思想
基數排序的時間複雜度與數字最大位數d有關,為o(d(n+r)),其中r為每位的基數,在自然數中為10,而d與n相關,所以實際時間複雜度是o(nlogn),演算法是穩定的
基本排序演算法總結:
1) 插入排序的原理:向有序序列中依次插入無序序列中待排序的記錄,直到無序序列為空,對應的有序序列即為排序的結果,其主旨是「插入」。直接插入 希爾排序
2) 交換排序的原理:先比較大小,如果逆序就進行交換,直到有序。其主旨是「若逆序就交換」。氣泡排序 快速排序
3) 選擇排序的原理:先找關鍵字最小的記錄,再放到已排好序的序列後面,依次選擇,直到全部有序,其主旨是「選擇」。簡單選擇 堆排序
4) 歸併排序的原理:依次對兩個有序子串行進行「合併」,直到合併為乙個有序序列為止,其主旨是「合併」。
5) 基數排序的原理:按待排序記錄的關鍵字的組成成分進行排序的一種方法,即依次比較各個記錄關鍵字相應「位」的值,進行排序,直到比較完所有的「位」,即得到乙個有序的序列。
實際排序演算法的選擇:
(1) 若n較小(如n值小於50),對排序穩定性不作要求時,宜採用選擇排序方法,直接插入排序法。但如果規模相同,且記錄本身所包含的資訊域比較多的情況下應首選簡單選擇排序方法。因為直接插入排序方法中記錄位置的移動操作次數比簡單選擇排序多,所以選用簡單選擇排序為宜。
(2) 如果序列的初始狀態已經是乙個按關鍵字基本有序的序列,則選擇直接插入排序方法和氣泡排序方法比較合適,因為「基本」有序的序列在排序時進行記錄位置的移動次數比較少。
(3) 如果n較大,則應採用時間複雜度為o(nlog2n)的排序方法,即快速排序、堆排序或歸併排序方法。快速排序是目前公認的內部排序的最好方法,當待排序的關鍵字是隨機分布時,快速排序所需的平均時間最少;堆排序所需的時間與快速排序相同,但輔助空間少於快速排序,並且不會出現最壞情況下時間複雜性達到o(n2)的狀況。這兩種排序方法都是不穩定的,若要求排序穩定則可選用歸併排序。通常可以將它和直接插入排序結合在一起用。先利用直接插入排序求得兩個子檔案,然後,再進行兩兩歸併
--後記
排序演算法也不僅僅用於數字int型,只要有了約定的順序規則,字串等型別也可以用這些思想進行排序
有最好的演算法,只有最合適的。實際應用中往往會遇到各種特殊條件,需要經過改進和優化,掌握基本的演算法思想是必須的
排序演算法總結(二)
歸併排序 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。我們一般取中位數,將前後兩部分排序在歸併為乙個序列,遞迴完成。include using namespace std void...
排序演算法總結(二)
歸併排序演算法思想是分而治之。下面將對分而治之演算法排序做乙個簡單描述。歸併排序之分而治之 void sort e,n else 對e插入排序 當k 2的時候,分而治之的排序演算法稱之為歸併排序,嚴格的來說是二路歸併排序,它的空間複雜度是o n 時間複雜度為o nlogn 歸併排序函式用乙個陣列a來...
排序演算法總結 二
排序演算法是一種基本並且常用的演算法。由於實際工作中處理的數量巨大,所以排序演算法對演算法本身的速度要求很高。而一般我們所謂的演算法的效能主要是指演算法的複雜度,一般用o方法來表示。在後面我將給出詳細的說明。對於排序的演算法我想先做一點簡單的介紹,也是給這篇文章理乙個提綱。我將按照演算法的複雜度,從...