題目簡述
輸入一串數字,要把其從小到大排列
每個數字可以和其左右鄰居的數字進行交換
輸出最少的交換次數,讓這串數字排列好
解題想法
使用Bubble Sort來實作,只要計算左右數字交換了幾次,然後輸出答案就可以了,但是因為時間複雜度是 $O(n^2)$ ,非常有可能會TLE
這題的題目雖然命名為Quick Sort,但實際上是用Merge Sort來排序
使用Merge Sort來實作,時間複雜度是 $O(nlogn)$ ,再來就是想怎麼計算交換次數了
考慮以下Merge時的狀況:
Index 0 1 2 3 4 5 Value 2 5 6 3 4 7 假設 Index 0~2 是左陣列, 3~5 是右陣列
第一輪因為 value 2 是最小的,因此不用動
Index 0 1 2 3 4 5 Value 2 5 6 3 4 7 Merge 2 第二輪右陣列的 value 3 是最小的,因此要往左交換(換句話說, value 5 和 6 會往後排),要交換的次數就是左陣列剩下還沒排的2個數字, counter=2
Index 0 1 2 3 4 5 Value 2 5 6 3 4 7 Merge 2 3 第三輪右陣列的 value 4 是最小的,因此要往左交換,要交換的次數就是左陣列剩下還沒排的2個數字, counter=2+2=4
Index 0 1 2 3 4 5 Value 2 5 6 3 4 7 Merge 2 3 4 第四輪左陣列的 value 5 是最小的,因此不需要進行交換,直接放進去, counter=4
Index 0 1 2 3 4 5 Value 2 5 6 3 4 7 Merge 2 3 4 5 第五輪左陣列的 value 6 是最小的,因此不需要進行交換,直接放進去, counter=4
Index 0 1 2 3 4 5 Value 2 5 6 3 4 7 Merge 2 3 4 5 6 第六輪右陣列的 value 7 是最小的,但是因為左陣列已經沒數字了,因此不需要進行交換,直接放進去, counter=4
Index 0 1 2 3 4 5 Value 2 5 6 3 4 7 Merge 2 3 4 5 6 7
counter要計算的,就是當Merge時要放右陣列的數字時,counter要加上左陣列剩下數字的數量
所以要做的事情就是實作Merge Sort,然後加上counter計算次數
程式碼
1 | /***************************************** |