首先總結
一趟冒泡:(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 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...