Python程式:查詢對陣列進行排序所需的交換次數
假設我們有一個名為nums的陣列,我們需要找到使nums按任何順序排序(升序或降序)所需的交換次數。
例如,如果輸入是nums = [2, 5, 6, 3, 4],則輸出為2,因為最初nums是[2, 5, 6, 3, 4]。如果我們交換數字6和4,陣列將變為[2,5,4,3,6]。然後,如果我們交換數字5和3,陣列將變為[2,3,4,5,6]。因此,使陣列按升序排序需要2次交換。
為了解決這個問題,我們將遵循以下步驟:
- 定義一個函式`swap_count()`。它將接收`input_arr`作為輸入。
- pos := 建立一個新列表,包含輸入陣列中每個元素的元組 (元素位置, 元素)。
- 根據`input_arr`中的元素對列表`pos`進行排序。
- cnt := 0
- 對於索引範圍從0到`input_arr`的大小,執行:
- 當True時,執行:
- 如果`pos[index, 0]`與索引相同,則
- 退出迴圈
- 否則,
- cnt := `swap_count` + 1
- swap_index := `pos[index, 0]`
- 交換`pos[index]`和`pos[swap_index]`的值。
- 如果`pos[index, 0]`與索引相同,則
- 當True時,執行:
- 返回cnt
- 在主函式/方法中,執行以下操作:
- 返回`swap_count(input_arr)`和`swap_count(input_arr`的反序)`的最小值。
示例
讓我們看看下面的實現,以便更好地理解:
def swap_count(input_arr): pos = sorted(list(enumerate(input_arr)), key=lambda x: x[1]) cnt = 0 for index in range(len(input_arr)): while True: if (pos[index][0] == index): break else: cnt += 1 swap_index = pos[index][0] pos[index], pos[swap_index] = pos[swap_index], pos[index] return cnt def solve(input_arr): return min(swap_count(input_arr), swap_count(input_arr[::-1])) nums = [2, 5, 6, 3, 4] print(solve(nums))
輸入
[2, 5, 6, 3, 4]
輸出
2
廣告