排序
:對一串行物件根據某個關鍵字進行排序;
穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
例如:插入排序、氣泡排序、歸併排序、計數排序、基數排序、桶排序
不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
例如:希爾排序、
快速排序、選擇排序、
堆排序內排序:不占用額外記憶體或占用常數的記憶體;
例如:插入排序、選擇排序、氣泡排序、堆排序、快速排序。
外排序:由於資料太大,因此把資料放在磁碟中,而排序通過磁碟和記憶體的資料傳輸才能進行;
例如:歸併排序、計數排序、基數排序、桶排序。
基於比較的排序:主要是通過關鍵記錄的比較和移動來實現。其時間複雜度下限為nlog(n);
不基於比較的排序:通常沒有大量的比較和移動操作。
排序關鍵的操作為:比較、移動;
排序分類:
(1)交換類:氣泡排序、快速排序;此類的特點是通過不斷的比較和交換進行排序;最壞情況就是逆序(2)插入類:簡單插入排序、希爾排序;此類的特點是通過插入的手段進行排序;
(3)選擇類:簡單選擇排序、堆排序;此類的特點是看準了再移動;
(4)歸併類:歸併排序;此類的特點是先分割後合併;
最好情況就是順序
歷史程序:一開始排序演算法的複雜度都在o(n^2),希爾排序的出現打破了這個僵局;
插入排序:
1、劃分。將序列分為有序區和無序區兩部分。初始化時,有序區為第乙個記錄;希爾排序:2、插入。將無序區的第乙個記錄插入到有序區中;
3、一直迴圈2的操作,直到無序區沒有記錄為止。
適用於:序列中記錄較少,序列基本有序
1、分割為子串行。等間隔跳躍分割為子串行,在子串行內進行插入排序;氣泡排序;2、一直迴圈1操作,直到間隔大於等於1為止。
1、劃分。將序列分為有序區和無序區兩部分。初始化時,有序區為空;快速排序:2、冒泡。從後向前兩兩比較,反序則交換;
3、一直迴圈2操作,直到無序區為空為止。
序列越隨機,演算法複雜度越低。不管是正序還是逆序,都是其最壞情況。
1、將i 和 j 分別指向待排序區域的最左側記錄和最右側記錄,並選取第乙個記錄為軸數;選擇排序:2、重複下述過程,直到 i = j :
(1)右側掃瞄,直到記錄 j 小於軸數; 如果 i < j,則將 r[j] 與 r[i] 交換,並將 i++;
(2)左側掃瞄,直到記錄 i 大於軸數; 如果 i < j,則將 r[i] 與 r[j] 交換,並將 j--;
3、退出迴圈,說明i和j指向了軸數,返回該位置
4、遞迴。對軸數前段、後段子序列分別執行上述操作,直到子串行中只含有1個元素為止。
1、劃分。將序列分為有序區和無序區兩部分。初始化時,有序區為空;堆排序:2、選擇。在無序區中選擇最小的記錄,將它與無序區的第乙個記錄交換,使有序區擴充套件了乙個記錄。
3、一直迴圈2操作,直到無序區為空為止。
優勢:移動次數較少,但比較次數相同。
目的:減少比較的次數。堆排序實際是一棵以順序方式儲存的完全二叉樹。
滿足以下性質:樹中任一非葉子結點的關鍵字不大於(或不小於)其左右孩子結點的關鍵字。演算法如下:
1、設定i和j,分別指向當前要篩選的結點和要篩選結點的左孩子;對比圖:2、若結點i已是葉子,則篩選完畢;否則,比較要篩選結點的左右孩子結點(如果有右孩子),並將j指向關鍵碼較大的結點;
3、將要篩選結點i的關鍵碼與j所指向的結點的關鍵碼進行比較
(1)如果結點i的關鍵碼大,則完全二叉樹已經是堆,篩選完畢;
(2)否則將r[i]與r[j]交換;令i=j,轉步驟2繼續進行篩選;
比較總結:
【從平均時間複雜度看】
1、直接插入、冒泡、選擇屬於一類,其時間複雜度是o(n^2)。其中,直接插入法比較常用,適用於序列的基本有序和序列記錄小於50的 情況。
2、堆、快速、歸併屬於第二類,其時間複雜度是o(nlogn)。
3、希爾屬於第三類,其時間複雜度介於o(n^2)與o(nlogn)之間。
【從最好情況看】
直接插入和冒泡的時間複雜度相同時o(n)。其他與平均時間複雜度相同。
【從最壞情況看】
堆、歸併、基數時間複雜度比較好。
【從輔助空間看】
快速屬於一類;歸併屬於一類;基數屬於一類;其他的屬於一類為o(1)。
【從穩定性來看】
穩定:
插入排序、氣泡排序、歸併排序、計數排序、基數排序、桶排序
不穩定:
希爾排序、快速排序、選擇排序、堆排序
【從移動次數來看】
排序法總結與比較
排序 對一串行物件依據某個keyword進行排序 穩定 假設a原本在b前面。而a b,排序之後a仍然在b的前面 比如 插入排序 氣泡排序 歸併排序 計數排序 基數排序 桶排序 不穩定 假設a原本在b的前面。而a b。排序之後a可能會出如今b的後面。比如 希爾排序 高速排序 選擇排序 堆排序內排序 不...
冒泡法與簡單選擇排序比較
如下 import random l1 random.randint 20 20 for i in range 10 length len l1 for i in range length count 0for j in range length i 1 if l1 j l1 j 1 l1 j l1...
排序比較與總結
之前一共實現了6種比較常見的排序演算法,分別是 選擇排序,插入排序,氣泡排序,歸併排序,快速排序,堆排序 效率 衡量乙個演算法的效率包括空間和時間,有時候還要考慮穩定性。前3種排序的方法效率較低,實現也比較簡單,適合規模比較小的排序,個人認為適合排序總量在10000以下的隨機數組。後3種排序的方法效...