看了學姐的面試題,忽然很想知道答案,就去百度上搜了一下:面試
1.選擇排序:不穩定,時間複雜度 O(n^2)算法
選擇排序的基本思想是對待排序的記錄序列進行n-1遍的處理,第i遍處理是將L[i..n]中最小者與L[i]交換位置。這樣,通過i遍處理以後,前i個記錄的位置已是正確的了。 shell
2.插入排序:穩定,時間複雜度 O(n^2)數組
插入排序的基本思想是,通過i-1遍處理後,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當位置,使得L[1..i] 又是排好序的序列。要達到這個目的,咱們能夠用順序比較的方法。首先比較L[i]和L[i-1],若是L[i-1]≤ L[i],則L[1..i]已排好序,第i遍處理就結束了;不然交換L[i]與L[i-1]的位置,繼續比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時爲止。圖1演示了對4個元素進行插入排序的過程,共須要(a),(b),(c)三次插入。spa
3.冒泡排序:穩定,時間複雜度 O(n^2)排序
冒泡排序方法是最簡單的排序方法。這種方法的基本思想是,將待排序的元素看做是豎着排列的「氣泡」,較小的元素比較輕,從而要往上浮。在冒泡排序算法中咱們要對這個「氣泡」序列處理若干遍。所謂一遍處理,就是自底向上檢查一遍這個序列,並時刻注意兩個相鄰的元素的順序是否正確。若是發現兩個相鄰元素的順序不對,即「輕」的元素在下面,就交換它們的位置。顯然,處理一遍以後,「最輕」的元素就浮到了最高位置;處理二遍以後,「次輕」的元素就浮到了次高位置。在做第二遍處理時,因爲最高位置上的元素已經是「最輕」元素,因此沒必要檢查。通常地,第i遍處理時,沒必要檢查第i高位置以上的元素,由於通過前面i-1遍的處理,它們已正確地排好序。 ci
4.堆排序:不穩定,時間複雜度 O(nlog n)table
堆排序是一種樹形選擇排序,在排序過程當中,將A[n]當作是徹底二叉樹的順序存儲結構,利用徹底二叉樹中雙親結點和孩子結點之間的內在關係來選擇最小的元素。 百度
5.歸併排序:穩定,時間複雜度 O(nlog n)二叉樹
設有兩個有序(升序)序列存儲在同一數組中相鄰的位置上,不妨設爲A[l..m],A[m+1..h],將它們歸併爲一個有序數列,並存儲在A[l..h]。
6.快速排序:不穩定,時間複雜度 最理想 O(nlogn) 最差時間O(n^2)
快速排序是對冒泡排序的一種本質改進。它的基本思想是經過一趟掃描後,使得排序序列的長度能大幅度地減小。在冒泡排序中,一次掃描只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減小1。快速排序經過一趟掃描,就能確保某個數(以它爲基準點吧)的左邊各數都比它小,右邊各數都比它大。而後又用一樣的方法處理它左右兩邊的數,直到基準點的左右只有一個元素爲止。
7.希爾排序:不穩定,時間複雜度 平均時間 O(nlogn) 最差時間O(n^s) 1<s<2
在直接插入排序算法中,每次插入一個數,使有序序列只增長1個節點,而且對插入下一個數沒有提供任何幫助。若是比較相隔較遠距離(稱爲 增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。D.L.shell於1959年在以他名字命名的排序算法中實現了這一思想。算法先將要排序的一組數按某個增量d分紅若干組,每組中記錄的下標相差d.對每組中所有元素進行排序,而後再用一個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分紅一組,排序完成。
排序類別 |
時間複雜度 |
空間複雜度 |
穩定 |
|
1 |
插入排序 |
O(n2) |
1 |
√ |
2 |
希爾排序 |
O(n2) |
1 |
× |
3 |
冒泡排序 |
O(n2) |
1 |
√ |
4 |
選擇排序 |
O(n2) |
1 |
× |
5 |
快速排序 |
O(Nlogn) |
O(logn) |
× |
6 |
堆排序 |
O(Nlogn) |
1 |
× |
7 |
歸併排序 |
O(Nlogn) |
O(n) |
√ |