--- title: 'UVa 10327 題解 — C++' disqus: hackmd --- # UVa 10327 題解 — C++ :::info :bulb: 此筆記為UVa 10327的題目詳解,包含解題思路、C++範例程式碼。 ::: ## Flip Sort (ZeroJudge a539.) ### [題目](https://zerojudge.tw/ShowProblem?problemid=a539) :::success 排序在電腦科學中是一個重要的部分。已經有許多優秀的排序演算法被提出。在這個問題中我們將討論一種排序的方式,就是你只能交換相鄰的 2 個元素。如果你想一下的話,你會瞭解以這樣的方式總是可以將一些數字排序。(註:我們通常稱這種排序方式為 Bubble Sort) 給你一串整數,請你用上述的方法來將之由小到大排序。要請你求出最少要交換幾次。例如給你 "1 2 3",那需要交換的次數為 0,因為已經排好了。如果給你 "2 3 1",則最少需要交換2次才可排好序。("2 3 1" → "2 1 3" → "1 2 3") ::: ### 輸入 / 輸出說明 | **輸入說明** | **輸出說明** | |:-|:-| | 輸入將以正整數 𝑁(𝑁 ≤ 1000)開始。接下來的幾行將有 𝑁 個整數。輸入將以 EOF 終止。 | 對於每個資料集列印 "Minimum exchange operations : 𝑀",其中 𝑀 是執行排序所需的最小翻轉操作。每一種情況都用一行來表示 | ### 解題思路 :::warning 將 m 作為計算次數的變數,先歸零再做 bubble sort,然後每次交換的時候將次數加 1 即可求得正確解答。 bubble sort (氣泡排序法) 就是將鄰近的兩的數字交換,將大的往右傳遞(類似氣泡不斷浮出水面),最終傳遞到的數字就是未排序中最大的。 假設我們要排序 7 5 1 2 3,第一次排序(最大的會浮到最右邊)順序如下,後面依此類推,不再演示: ![bubble sort](https://hackmd.io/_uploads/B1dhhQhaJx.png =50%x) ::: ### 範例程式碼 ```C++= #include <iostream> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int i, j, n, m, temp; while (cin >> n) { int a[n]; m = 0; for (i=0;i<n;i++) cin >> a[i]; for (i=0;i<n-1;i++) { for (j=0;j<n-i-1;j++) { if (a[j] > a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; m++; } } } cout << "Minimum exchange operations : " << m << endl; } return 0; } ``` ### 運行結果 <font color="#00BB00">**AC**</font> (5ms, 336KB) ###### tags: `CPE 2星` :::danger 查看更多資訊請至:https://www.tseng-school.com/ :::