最壞均時間複雜度o(n^2) ---整個陣列都是逆序的情況
最好情況o(n) -----整個陣列都已經是順序的情況(對應version3,version1、2不是)
public static void main(string arg)
}} //小到大 -----version 2
for(int i=0;i=i;j--)
}} //小到大 -----version 3
for(int i=0;i=i;j--)
}if(!haschanged) break;
} //格式化輸出
formatter fmt=new formatter(system.out);
for(int num:data)
fmt.format("%d ", num);
}
public static void main(string arg)
}} //格式化輸出
formatter fmt=new formatter(system.out);
for(int num:data)
fmt.format("%d ", num);
}
最差情況o(n^2)
最好情況o(n)
這種排序就像插撲克牌一樣,把前面的序列做有手中已經有序的撲克牌,後面的是你要摸的牌,每次新增一張牌,一直到摸完。
初次見這個排序還是兩年前……當時覺得還挺難的……
巢狀的for裡面加了data[j-1]>now這個條件。
裡面的for在尋找新來的「牌」需要插入的位置,一邊找一邊向後挪資料,空出前面的乙個位置。tricky的地方是,可以直接覆蓋資料。我可以直接空出來乙個位置,儘管這個位置上還是有資料,我用插進來的資料覆蓋掉之前的資料就可以了。
為什麼要從有序陣列的後面開始移動資料呢? 你說呢?想想也是……前面的怎麼向前移……
(當然你也可以用後面的做有序的陣列,從前面找數插入後面,那樣子就是反過來從前面移動資料)
public static void main(string arg)
//格式化輸出
formatter fmt=new formatter(system.out);
for(int num:data)
fmt.format("%d ", num);
}
這兩種排序元素交換的次數必定一樣。
因為決定這個的,是陣列中逆序對的個數。每一次元素交換,都會消掉乙個逆序對。
這樣子,我們可以把這兩種演算法用在 基本有序 的資料中, 非常簡單,而且高效。
另外,他們的共同特點是依靠交換相鄰2元素消除逆序對來排序,而任何僅僅靠交換相鄰2元素的排序演算法的平均複雜度最好是o(n^2).
那麼能不能一次不是消掉兩個相鄰的逆序對呢?
在插入排序的基礎上,會先做幾次d間隔的插入排序。
舉個例子,我先做一次7間隔的插入排序(一次排序先排7、14、21...再排1、8、15……一直排到6、13……)
再做一次5間隔的插入排序
再3間隔
最後到1間隔
為什麼要這樣做呢?
1.「插入排序演算法用在 基本有序 的資料中, 非常簡單,而且高效。」
2.在d減小的過程中,大間隔排過的有序在小間隔中仍然有序。
有一點注意,不互質的間隔是不起作用的,8間隔之後4間隔就不起作用了。所以,間隔的取法也有講究。有很多間隔的序列,具體不說了。
這種演算法時間複雜度還在討論中。 要不然你來分析一下?哈哈
稍微高階一點的排序
複雜度o(nlogn)
雖說理論這樣,但是資料量大了之後實際應用起來效果不如希爾排序。
複雜度o(nlogn)
Java排序演算法之氣泡排序 插入排序 選擇排序
一 前言 排序是日常中最常見的一種演算法,常見的演算法有 氣泡排序 插入排序 選擇排序 歸併排序 快速排序 計數排序 快速排序 基數排序 桶排序。那麼該怎樣分析和學習排序演算法呢?二 演算法的分析課 在上述的八種排序方法中,根據時間複雜度和是否基於比較可以為三種 排序演算法 時間複雜度 是否基於比較...
java排序演算法 氣泡排序 選擇排序 插入排序
氣泡排序 原理 是臨近的數字兩兩進行比較,按照從小到大或者從大到小的順序進行交換,這樣一趟過去後,最大或最小的數字被交換到了最後一位,然後再從頭開始進行兩兩比較交換,直到倒數第二位時結束 author daopinz public class bubblesort system.out.printl...
Java排序 氣泡排序 插入排序和選擇排序
插入排序 1 特殊 從第二個元素開始,和第乙個元素比較,如果滿足排序的順序,則交換順序。2 一般 把待比較和他之前的所有元素相比 從右往左 如果滿足排序的順序,這交換。private static void insertsort int arr 2 氣泡排序 1 從第乙個元素開始,和第二個元素相比,...