排序演算法總結

2021-09-13 21:03:42 字數 2210 閱讀 9412

首先總結

一趟冒泡:(n-1次比較)

1跟2比較,交換;2跟3比較,交換;3跟4比較,交換。。。。。。最後得到乙個最值放在末尾處,然後它就不動了。

對剩下的n-1個元素進行第二趟:(n-2次比較)

1跟2比較,交換;2跟3比較,交換;3跟4比較,交換。。。。。。得到乙個最值放在倒數第二個位置,不動了。

對剩下的n-2個元素進行第三趟:(n-3次比較)

。。。對剩下的2個元素進行第n-1趟:(1次比較)

最終比較/交換次數為

(n-1)+(n-2)+(n-3)+(n-4)+ … +1 = n(n-1)/2 =o(n2)

加入識別符號,若一趟下來沒有交換,則說明已經排好,平均時間減半,(n^2)/2

第一趟:(1次比較,[0,3]次元素移動)//要麼不移,一移就是3個語句,移動需要乙個臨時變數

把第2個元素往第1個元素裡插,要麼放在它前面,要麼放在它後面

第二趟:([1,2]次比較,[0,4]次元素移動)

把第3個元素往前2個元素裡插,其實就是依次與前面2個元素比較,然後插在合適的位置。

第三趟:([1,3]次比較,[0,5]次元素移動)

把第4個元素往前3個元素裡插,依次與前面3個元素比較,然後插在合適的位置。

。。。第n-1趟:([1,n-1]次比較,[0,n+1]次元素移動)

把第n個元素往前n-1個元素裡插,依次與前面n-1個元素比較,然後插在合適的位置。

最好情況

n次比較 + 0次移動語句

最壞情況

(n-1)+(n-2)+(n-3)+(n-4)+ … +1 = n(n-1)/2次比較+

(n+1)+(n)+(n-1)+(n-2)+ … +3 = (n+4)(n-1)/2次移動語句

複雜度為o(n2)

本來是n趟,每次比較o(n)次

改進後是n趟,每次比較o(log2n)次,因為使用了折半查詢

所以複雜度變為o(nlog2n)

適用於n較大並且初始元素比較雜亂的情況,若初始元素接近有序時,使用直接插入會更好。

第一趟:

把第乙個元素拎出來,和後面的每個元素進行比較,比它大放左邊,比它小放右邊,這樣就分成了左右兩個佇列。

第二趟:

對左右兩個對列進行同樣的操作,拎出第乙個元素,繼續分

這是乙個遞迴呼叫

時間複雜度為o(nlog2n)

如果待排序佇列本身有序,反而會退化成n(n-1)/2,這是因為遞迴樹變成了單支樹

快排水很深,有一些改進方法

第一趟,在n個元素裡找最小值,放到第1位,不管了(n-1次比較,[0,3]次移動)

第二趟,在剩下的n-1個元素裡找最小值,放到第2位,不管了(n-2次比較,[0,3]次移動)

第三趟,在剩下的n-2個元素裡找最小值,放到第3位,不管了(n-3次比較,[0,3]次移動)

。。。第n-1趟,在剩下的2個元素裡找最小值,放到第n-1位,結束(1次比較,[0,3]次移動)

又是從1加到n-1,(n-1)+(n-2)+(n-3)+(n-4)+ … +1 = n(n-1)/2次比較

但它的比較次數是恆定的,而移動語句的次數最好為0,最壞為3(n-1)

適合於元素很多,但元素占用空間很小的情況,移動起來很快的那種。

複雜度o(n2)

首先建立大頂堆(所有的父節點都比子節點要大)

然後把最大扔掉(其實是與老末交換),把老末(末尾的元素,不一定是最小的)提上來,放到根節點,重新建立大頂堆,然後就找到了第二大的元素,然後這樣繼續下去。

將表轉化為堆的時間複雜度為o(n)

之後要建立n-1次大頂堆,每一次複雜度為o(log2n)

因此時間複雜度為o(nlog2n)

使用gap=gap/2或gap=gap/3+1,把佇列分為間隔為gap的gap個小佇列。

特點是充分利用直接插入排序的特性:

1)適用於元素少的佇列

2)適用於基本有序的佇列

對每個小佇列使用直接插入排序。一開始gap大,每個小佇列元素少,直接插入排序快。之後隨著gap變小,每個小佇列元素大,但已經基本有序了,直接插入也很快。

先兩兩比較,合成乙個個小佇列,再把這些小佇列兩兩比較(把後面的每個元素一次往前面插),這樣不斷進行指導最終合併成乙個

需要乙個與元素組一樣大的輔助空間

時間複雜度為o(nlog2n),不隨初始佇列的情況改變。

排序演算法總結

1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...

排序演算法總結

1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...

排序演算法總結

學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...