選擇排序是一種簡單直觀的排序算法,它的基本思想是每一輪選擇未排序部分的最小元素,然后將其放到已排序部分的末尾。這個過程持續進行,直到整個數組排序完成。(重點:通過位置找元素)
以下是選擇排序的詳細步驟和 Python 實現:
選擇排序 包括以下幾個關鍵步驟:
-
初始狀態: 將整個數組劃分為已排序部分和未排序部分。初始時,已排序部分為空,未排序部分包含整個數組。
-
選擇最小元素: 在未排序部分中找到最小的元素,并記錄其索引。遍歷未排序部分的元素,找到其中最小的元素。
-
交換位置: 將最小元素與未排序部分的第一個元素交換位置。通過交換,將最小元素放到已排序部分的末尾,同時將未排序部分的起始位置向右移動一個元素。
-
迭代: 重復執行步驟 2 和步驟 3,直到未排序部分為空。每一輪迭代都會選擇未排序部分的最小元素,將其放到已排序部分的末尾。
-
排序完成: 當未排序部分為空時,整個數組排序完成。已排序部分包含整個數組,按順序排列。
以下是選擇排序的要點總結:
-
不穩定性: 選擇排序是一種不穩定的排序算法,相等元素的相對位置可能會改變。
-
時間復雜度: 選擇排序的時間復雜度為 O(n^2),其中 n 是數組的長度。這是因為每一輪都需要在未排序部分找到最小元素,而總共有 n-1 輪。
-
空間復雜度: 選擇排序的空間復雜度為 O(1),因為它只需要常數級的額外空間用于記錄最小元素的索引。
-
簡單實現: 選擇排序的實現相對簡單,適用于對規模較小的數據集進行排序。然而,在大規模數據集上,性能相對較差,更高效的排序算法如快速排序和歸并排序通常更為合適。
Python 實現選擇排序:
def selection_sort(arr):n = len(arr)# 遍歷整個數組for i in range(n):# 假設當前位置的元素為最小值min_index = i# 在未排序部分找到最小元素的索引for j in range(i + 1, n):if arr[j] < arr[min_index]:min_index = j# 將最小元素與未排序部分的第一個元素交換位置arr[i], arr[min_index] = arr[min_index], arr[i]# 示例
arr = [64, 25, 12, 22, 11]
selection_sort(arr)
print("排序后的數組:", arr)
在這個示例中,selection_sort
函數實現了選擇排序算法。它通過兩層嵌套的循環,在每一輪外層循環中選擇未排序部分的最小元素,并將其放到已排序部分的末尾。最后,輸出排序后的數組。
個人示例:
"""選擇排序 位置來找元素"""
sortList = [2,1,5,3,5,6,8]
for i in range(0,len(sortList)-1):"""通過定義一個變量index 來記錄 此時需排序的位置"""index=ifor j in range(i+1,len(sortList)): #if sortList[index] > sortList[j]:# 代碼塊內容index=j"""循環結束 讓最小的元素與相應位置上的元素進行交換"""sortList[index],sortList[i]=sortList[i],sortList[index]
print(sortList)
這段代碼實現了選擇排序的算法。以下是關鍵點的介紹:
外層循環 (for i in range(0, len(sortList) - 1)): 這是選擇排序的外層循環,負責遍歷整個數組。i 表示已排序部分的末尾位置,初始時為 0。
內層循環 (for j in range(i + 1, len(sortList))): 這是選擇排序的內層循環,在未排序部分中查找最小元素。j 表示未排序部分的當前位置。對于 for j in range(i+1, len(sortList)) 中的 len(sortList),這表示整個數組的長度,而不是 len(sortList-1)。在編程中,數組的索引是從0開始的,所以數組的最后一個元素的索引是 len(sortList) - 1,而不是 len(sortList)。因此,在排序算法中,通常使用 len(sortList) 來表示數組的長度。在具體的排序算法中,for j in range(i+1, len(sortList)) 的目的是遍歷數組中從索引 i+1 到數組末尾的所有元素,這正是未排序部分的元素。由于 Python 中 range 函數是左閉右開區間,所以 range(i+1, len(sortList)) 會遍歷從 i+1 到 len(sortList)-1 的索引。
如果使用 len(sortList-1),則會導致遍歷的結束位置是 len(sortList-1)-1,這與我們的預期不符,因為我們希望遍歷到數組的最后一個元素。因此,正確的寫法是使用 len(sortList)。
查找最小元素: 通過比較 sortList[index] 和 sortList[j] 的大小,如果找到更小的元素,更新 index。
交換位置 (sortList[index], sortList[i] = sortList[i], sortList[index]): 內層循環結束后,將找到的最小元素與已排序部分的末尾元素進行交換。
循環結束后輸出排序后的數組 (print(sortList)): 外層循環執行完成后,整個數組就完成了排序。
總體來說,選擇排序的核心思想是在未排序部分中選擇最小的元素,然后與已排序部分的末尾元素交換,逐步完成排序。
選擇排序的時間復雜度為 O(n^2),空間復雜度為 O(1)。盡管選擇排序的性能相對較差,但它的實現簡單,適用于較小規模的數據集。