排序演算法很多,這裡做個總結,最重要的是記住演算法思想,而不是記住程式怎麼寫。程式過一段時間就會忘了,演算法原理熟悉了現場寫出來應該是很容易的。
時間複雜度為o(n^2)的三種排序演算法:插入排序、選擇排序、氣泡排序。
插入排序:插入排序是選定元素找位置。對於位置為p上的元素,假定0~p-1的元素已經排序,如果p比它前面的元素小,那麼p上的元素應該向前移動,直到p前面所有的元素都比它小為止。
void insertsort(int* a, int length)
}
選擇排序:選擇排序是選定位置找元素。第乙個位置上應該是最小的元素,那麼先把最小的元素找出來放在第乙個位置上。然後再考慮第二個位置,它應該放上第二小的元素,所以遍歷剩下的元素找出最小的放在第二個位置上,直到所有位置都放上了合適的元素。
void selectsort(int* a, int length)
} a[indexofmin] = a[i];
a[i] = min;
}}
氣泡排序:氣泡排序也是選定位置找元素。氣泡排序的實現過程是兩兩交換,每次從最右邊開始的元素開始比較,如果右邊的元素比它左邊一位的元素小,那麼交換兩個元素。例如3,2,1交換一次變成3,1,2,再交換一次變成1,3,2。這一過程總是使最小的元素移到最左邊,最左邊定義為0的時候最小的元素交換到位置0上,最左邊定義為1時剩下的元素中最小的元素(也就是第二小)交換到位置1上,以此類推。
氣泡排序和選擇排序過程很相似,但是氣泡排序的交換過程具有盲目性。氣泡排序只要右邊元素比左邊小都會發生交換,而選擇排序只有當前元素小於最小值時記錄最小值得位置(實際上等同於交換),內層迴圈結束後才發生一次交換。選擇排序的交換次數比氣泡排序小,效能略優於氣泡排序。
void bubblesort(int* a, int length)
} }}
時間複雜度為o(nlogn)的四種排序演算法:希爾排序、堆排序、歸併排序、快速排序。
希爾排序:希爾排序只需要記住一條:它是變間隔的插入排序!插入排序那裡比較的元素都是相鄰的兩個元素,間隔為1。希爾排序通過設定比較間隔,然後間隔逐漸縮小直到為1,所以希爾排序的最後一趟,也就是間隔為1的時候完全等同於插入排序了。間隔序列h1,h2,h3…hn叫做增量序列,增量序列的選取也會對排序演算法的效能有影響,由於希爾排序很少使用就不討論了。
void shellsort(int* a, int length)
}}
堆排序:堆排序根據最大堆的堆頂總是堆上最大數的性質,每次交換堆頂和堆最後乙個元素,這樣堆頂元素放在了正確的位置,而由於堆頂更換了新的元素,需要下濾維護堆序。下濾完成以後可以看成比第一部大小減一的新的堆,繼續交換堆頂和最後乙個元素,這樣第二大的數也擺在正確的位置上,重複這個過程直到堆的大小為0,即所有元素都已經擺放到合適的位置上。
#define leftchild(i) 2*i+1
void swap(int& a, int& b)
//最大堆下濾過程
void percdown(int* a, int n, int i)
a[i] = tmp;
}void heapsort(int* a, int n)
}
歸併排序:歸併排序假設存在兩個已經排序的子陣列a和b,申請乙個額外的陣列c,大小為n,每次從陣列中a或b中取較小的數放入c中,直到其中乙個子陣列取完,另外乙個子陣列剩下的元素直接拷貝到陣列c中。對於要排序的陣列array,可以將array劃分成兩半,呼叫上述合併的過程,而對於各自部分的排序,遞迴的呼叫合併排序的函式。歸併排序需要額外的大小為n的輔助空間,時間複雜度為o(nlogn)。
void merge(int* array, int* tmparray, int lpos, int rpos, int rposend)
while(indexl < rpos)
tmparray[index++] = array[indexl++];
while(indexr <= rposend)
tmparray[index++] = array[indexr++];
for(int i = 0; i < numofelement; ++i)
array[i+lpos] = tmparray[i+lpos];
}void mergesortcore(int* array, int* tmparray, int start, int end)
}void mergesort(int* array, int length)
else
}
快速排序:快速排序是實踐中已知的最快的排序演算法。快速排序的過程是乙個分組的過程,選定基準值,從陣列的前後兩頭同時開始遍歷陣列,如果左邊的數小於基準值,滑過指標,如果右邊的值大於或等於基準值,也滑過指標。當左邊的值大於基準值而右邊的值小於基準值時,交換兩個數,直到兩個指標交叉。這一過程使得陣列中小於基準值的數都位於基準值的左邊,大於基準值的數都位於基準值右邊,基準值的位置已經確定不再改變,在分別排序基準值的左邊和右邊。
void swap(int& p1, int& p2)
void qsort(int* array, int start, int end)
swap(array[start], array[pright]);
qsort(array, start, pright - 1);
qsort(array, pright + 1, end); }}
void quicksort(int* array, int length)
排序演算法效能分析: 基本排序演算法總結
1.插入排序 insertion sort o n2 對少量資料排序很有效,不需要額外的儲存空間。待排序列已經是從小到大,最壞就是逆序的時候了。且是穩定的。include include int exchange int a,int i,int j int insert int a,int s,in...
基本排序演算法總結
排序演算法的評價 評價排序演算法的一般準則是 平均情況下的排序速度 最優最劣情況下的速度 行為是否自然 是否以相等的關鍵字重排元素 陣列的排序速度直接與比較 comparison 次數和交換 exchange 次數相關,其中交換的作用更大,因為占用的時間多。如果頻繁遭遇到最優最劣情況,則最優和最劣情...
基本排序演算法總結
參考部落格 傳送門 目錄 各排序時間複雜度 氣泡排序 選擇排序 插入排序 希爾演算法 堆排序 氣泡排序 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。...