原地排序演算法

2022-09-23 21:39:16 字數 2867 閱讀 6003

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 操作,這樣就得到了乙個大根堆 腦袋是最大的 然後我們把最大的那個數和陣列的最後乙個元素交換,這樣一來,陣...