1、選擇排序
第一輪迴圈
1)從陣列0~n中選擇出最大,與索引位0的數進行交換。
第二輪迴圈
1)從陣列中1~n選擇出最大,與索引位1的數進行交換。
2)……
第n-1輪迴圈
3)從陣列n-1~n中選擇出最大,與索引位n-1的數進行交換。
時間複雜度:
1)交換操作0~n-1次;最好的情況:已經有序,o(0)。最差的情況每次比較都需要交換o(n-1)
2)比較操作(n-1)+(n-2)+(n-3)+……+(n+1-n)次【等差數列】o(n^2)
n*(n-1)/2
3)不穩定性:個人感覺是指交換操作在值相等的情況下,是不需要操作的。以後有更深的理解後再看。如果當前值已經在排序後的位置上,那麼也不需要交換
示例:
2 5 3 1 3 8 -> 索引0和6位置交換
8 5 3 1 3 2 -> 不變
8 5 3 1 3 2 -> 不變
8 5 3 3 1 2 -> 索引3和4位置交換
8 5 3 3 2 1 -> 索引4和5位置交換
**示例:
//從0~n選出乙個最小的值放到0索引位置
//從1~n選出乙個最小的值放到1索引位置
//……
//第一層迴圈,n-1次迴圈
for (int i = 0; i < arr.length - 1; i++)
}if (idx !=i)
}
2、氣泡排序
第一輪迴圈
1)索引位置0和索引位置1比較,左邊大於右邊,則交換
2)索引位置1和索引位置2比較,左邊大於右邊,則交換
3)……
4)索引位置n-2和索引位置n-1比較,左邊大於右邊,則交換
第二輪迴圈
1)索引位置0和索引位置1比較,左邊大於右邊,則交換
2)索引位置1和索引位置2比較,左邊大於右邊,則交換
3)……
4)索引位置n-3和索引位置n-2比較,左邊大於右邊,則交換
第n-1輪迴圈
1)索引位置0和索引位置1比較,左邊大於右邊,則交換
時間複雜度:
1)交換操作0~(n-1)+(n-2)+(n-3)+……+1 -> 套用上面的結果 n*(n-1)/2
2)比較操作(n-1)+(n-2)+(n-3)+……+1 -> n*(n-1)/2
3)不穩定性,也是交換上面,有些是不需要交換的
示例:
2 5 3 1 3 8
2 5 3 1 3 8 -> 不變
2 3 5 1 3 8 -> 索引1和2的位置交換
2 3 1 5 3 8 -> 索引3和4位置交換
2 3 1 3 5 8 -> 索引4和5位置交換
2 3 1 3 5 8 -> 不變
2 3 1 3 5 8 -> 不變
2 1 3 3 5 8 -> 索引1和2的位置交換
2 1 3 3 5 8 -> 不變
2 1 3 3 5 8 -> 不變
1 2 3 3 5 8 -> 索引0和1的位置交換
1 2 3 3 5 8 -> 不變
1 2 3 3 5 8 -> 不變
**示例:
//n-1外層迴圈
for (int i = 0; i < arr.length - 1; i++)
}}
3、插入排序(模擬撲克牌的排序原則,抽到一張牌之後找到合適的位置插入)
由於索引位置0必為有序,所以不處理
第一輪迴圈
1)從索引1位置開始與索引0位置比較,小於則交換
第二輪迴圈
1)從索引2位置與索引1位置比較,小於則交換
2)從索引1位置開始與索引0位置比較,小於則交換
第三輪迴圈
1)從索引3位置與索引2位置比較,小於則交換
2)從索引2位置開始與索引1位置比較,小於則交換
3)從索引1位置開始與索引0位置比較,小於則交換
第n-1輪迴圈
1)從索引n-1位置與索引n-2位置比較,小於則交換
2)從索引n-2位置與索引n-2位置比較,小於則交換
n-1)從索引1位置與索引0位置比較,小於則交換
時間複雜度:
1)交換操作:0~(0+1+2+3+……+n-1) -> 0~(n*(n-1)/2)
2)比較操作:n-1~(0+1+2+3+……+n-1) -> (n*(n-1)/2)。當左值始終比右值大的情況下,就不需要繼續向左比較了,所以最好的情況下是每一輪迴圈值需要做一次比較的情況
3)不穩定性:如果數值正好處於最終排序後的位置,則當前迴圈可以不必向左比較和交換。此特性在陣列已經有部分排好序的情況下,將提公升效率
示例:
2 5 3 1 3 8
2 5 3 1 3 8
2 3 5 1 3 8
2 3 1 5 3 8
2 1 3 5 3 8
1 2 3 5 3 8
1 2 3 3 5 8
1 2 3 3 5 8
**示例:
//從1開始,進行n-1次迴圈
for (int i = 1; i < arr.length; i++)
}
原地堆排序
siwuxie095 原地堆排序 程式 1 原地堆排序的實現 sorttesthelper.h ifndef sorttesthelper h define sorttesthelper h include include include include include using namespac...
原地堆排序
上一節講的兩種堆排序都需要開闢o n 的輔助空間 建構函式中使用new分配的輔助空間 程式在開闢輔助空間和釋放空間的時候也會消耗一定的時間,若能多陣列進行原地堆排序,則省去了開闢和釋放空間的時間,時間效能會好一些。給定乙個大小為n的陣列,將這個陣列heapify,變為最大堆,此時陣列的第乙個元素就是...
原地堆排序
堆排序 我之前使用的堆排序是要開 乙個長度為 n的陣列,事實上,我們可以把原陣列看成乙個堆,也就是說我們不用開乙個陣列,而是在原地排序 怎麼說呢 還是給我乙個陣列,我對這個陣列進行heapify 操作,這樣就得到了乙個大根堆 腦袋是最大的 然後我們把最大的那個數和陣列的最後乙個元素交換,這樣一來,陣...