直接選擇排序演算法
A. 直接選擇排序演算法在最好情況下的時間復雜度為多少
關鍵字比較次數永遠是n(n-1)/2,記錄移動次數最多為3(n-1),最少0次,前者起主導作用,因此實際上時間復雜度還是O(n^2)。
在直接選擇排序中,共需要進行n-1次選擇和交換,每次選擇需要進行 n-i 次比較 (1<=i<=n-1),而每次交換最多需要3次移動,因此,總的比較次數C=(n*n - n)/2,總的移動次數 3(n-1).由此可知,直接選擇排序的時間復雜度為 O(n2) 。
(1)直接選擇排序演算法擴展閱讀:
直接選擇排序的基本思想是:第一次從R[0]~R[n-1]中選取最小值,與R[0]交換,第二次從R[1]~R[n-1]中選取最小值,與R[1]交換,....,第i次從R[i-1]~R[n-1]中選取最小值,與R[i-1]交換,.....,第n-1次從R[n-2]~R[n-1]中選取最小值。
與R[n-2]交換,總共通過n-1次,得到一個按排序碼從小到大排列的有序序列。當記錄佔用位元組數較多時,通常比直接插入排序的執行速度快些。由於在直接選擇排序中存在著不相鄰元素之間的互換,因此,直接選擇排序是一種不穩定的排序方法。
B. 第一排01第二排02 03,以此類推,怎麼用代碼實現數據排列效果
選擇排序是常用內部排序的一種,常見的實現演算法有直接選擇排序演算法和堆排序演算法,選擇排序的基本思想是每次從待排數據中選擇第n小的數據放到排序列表的第n個位置,假如共有N個數據待排,那麼經過N-1次排序後,待排數據就已經按照從小到大的順序排列了。
直接選擇排序演算法的思想比較簡單:(假設數據放在一個數組a中,且數組的長度是N)
1:從a[0]-a[N-1]中選出最小的數據,然後與a[0]交換位置
2:從a[1]-a[N-1]中選出最小的數據,然後與a[1]交換位置(第1步結束後a[0]就是N個數的最小值)
3:從a[2]-a[N-1]中選出最小的數據,然後與a[2]交換位置(第2步結束後a[1]就是N-1個數的最小值)
以此類推,N-1次排序後,待排數據就已經按照從小到大的順序排列了。
直接選擇排序的java實現如下:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void selectionSort(int[] elements){
for(int i = 0; i < elements.length-1; ++i){
int k = i;
for(int j = i; j < elements.length; ++j){
if(elements[k] > elements[j]){
k = j;
}
}
if(k != i){//交換元素
int temp = elements[i];
elements[i] = elements[k];
elements[k] = temp;
}
}
}
直接選擇排序演算法的思路很清晰,實現起來也比較簡單,但是效率不是很高(O(n*n))。
堆排序演算法和直接選擇排序演算法最大的不同在於,堆排序演算法充分利用大頂堆和完全二叉樹的性質,保留每次排序後的結構,同時由於每次比較只是比較根節點和它的子節點,因此大大降低了比較的次數和交換的次數,從而提高效率,堆排序演算法的時間復雜度是O(nlogn,以2為底)。
堆排序演算法的思想是:(假設數據放在一個數組a中,且數組的長度是N)
1:以數組a為數據,建立一個大頂堆(這樣對於二叉樹的每個節點,根節點總是比子節點大,其實沒必要要求二叉樹的每個子樹也是大頂堆)
2:交換大頂堆的根節點和數組a中的最後一個節點(最後一個節點不在參與後邊的工作)
重復上邊的工作,經過N-1次後,數組a已經排好序。
其他的我不太會
C. 簡單(直接)選擇排序的穩定性
簡單選擇排序是不穩定排序。
假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序後的序列中,r[i]仍在r[j]之前,則稱這種排序演算法是穩定的;否則稱為不穩定的。
(3)直接選擇排序演算法擴展閱讀:
簡單選擇排序的最優情況:
最好情況下,即待排序記錄初始狀態就已經是升序排列了,則不需要移動記錄。
對於不穩定的排序演算法,只要舉出一個實例,即可說明它的不穩定性;而對於穩定的排序演算法,必須對演算法進行分析從而得到穩定的特性。
排序演算法是否為穩定的是由具體演算法決定的,不穩定的演算法在某種條件下可以變為穩定的演算法,而穩定的演算法在某種條件下也可以變為不穩定的演算法。
基數排序、冒泡排序、直接插入排序、折半插入排序、歸並排序是穩定的排序演算法。
堆排序、快速排序、希爾排序、直接選擇排序是不穩定的排序演算法。
參考資料來源:網路-簡單選擇排序
參考資料來源:網路-排序演算法穩定性
D. 數據結構-八大排序演算法的時間復雜度 穩定性
1:直接插入排序:
最好:待排序已經有序, 從前往後走都不用往裡面 插入。 時間復雜度為o(n)
最壞:待排序列是逆序,每一次都要移位插入。 時間復雜度o(n^2)
是穩定排序
2:希爾排序:
最好:縮小增量的插入排序,待排序已經有序。時間復雜度o(n)
一般:平均時間復雜度o(n 1.3),最差也是時間復雜度o(n 1.3)
不穩定排序
3:冒泡排序:
最好:待排序已經有序。時間復雜度o(n)
最壞:待排序是逆序。時間復雜度o(n^2)
穩定排序
4:快速排序:
最好:待排序無序。時間復雜度o(nlogn)
最壞: 待排序已經有序,基準定義在開始。 時間復雜度為o(n^2)
不穩定排序
5:直接選擇排序:
無論好壞:o(n^2)
穩定排序
6:堆排序:
無論好壞:時間復雜度o(nlogn)
不穩定排序
7:歸並排序:
穩定排序
8:基數排序:
無論好壞:o(d(n+r)) ,r為基數,d為位數.
穩定排序