排序演算法之python簡單選擇排序
簡單選擇排序
介紹:
簡單選擇排序是一種選擇排序。每趟從待排序的記錄中選出關鍵字最小的記錄,順序放在已排序的記錄序列末尾,直到全部排序結束為止
思想:
選擇排序思想很簡單,就是每次從待排序列中找出關鍵字最小的元素,放入已經排好的序列中,本質上就是第一次在後面選出最小的元素就是最終序列的第一小元素,第二次在後面選出的最小元素就是最終序列的第二小元素,如此重複,直到待排序列為空。其實這個排序有點類似於氣泡排序,氣泡排序是每一趟都把最大的往後移,即確定一個第幾大的元素;而簡單選擇排序是每一趟都是把小的往前挪,確定一個第幾小的元素。
程式碼:
def SelectSort(input_list): l = len(input_list) if l == 0: return [] sorted_list = input_list for i in range(l): #預設第i個元素是每次的最小值的索引 min_index = i #找到後面元素最小的索引 for j in range(i+1,l): if sorted_list[min_index] >sorted_list[j]: min_index = j #將找到的最小元素放入前面已經有序序列的末尾 temp = sorted_list[i] sorted_list[i] = sorted_list[min_index] sorted_list[min_index] = temp print("%dth"%(i+1)) print(sorted_list) return sorted_list if __name__ == '__main__': input_list = [50,123,543,187,49,30,0,2,11,100] print("input_list:") print(input_list) sorted_list = SelectSort(input_list) print("sorted_list:") print(input_list)
結果:
input_list: [50, 123, 543, 187, 49, 30, 0, 2, 11, 100] 1th [0, 123, 543, 187, 49, 30, 50, 2, 11, 100] 2th [0, 2, 543, 187, 49, 30, 50, 123, 11, 100] 3th [0, 2, 11, 187, 49, 30, 50, 123, 543, 100] 4th [0, 2, 11, 30, 49, 187, 50, 123, 543, 100] 5th [0, 2, 11, 30, 49, 187, 50, 123, 543, 100] 6th [0, 2, 11, 30, 49, 50, 187, 123, 543, 100] 7th [0, 2, 11, 30, 49, 50, 100, 123, 543, 187] 8th [0, 2, 11, 30, 49, 50, 100, 123, 543, 187] 9th [0, 2, 11, 30, 49, 50, 100, 123, 187, 543] 10th [0, 2, 11, 30, 49, 50, 100, 123, 187, 543] sorted_list: [0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
分析:
1.演算法效能
2.時間複雜度
簡單選擇排序的比較次數與序列的初始排序無關。 假設待排序的序列有 N 個元素,則比較次數總是N (N - 1) / 2。而移動次數與序列的初始排序有關。當序列正序時,移動次數最少為 0;當序列反序時,移動次數最多,為3N (N - 1) / 2。所以,簡單排序的時間複雜度為 O(N^2)。
3、空間複雜度
需要一個臨時變數儲存最小索引,O(1)
3.演算法穩定性
不穩定,例如待排序列為{5,2,5',1},第一次將5作為初始最小元素,遇到5'就把5'與5的位置對換了,故該演算法是不穩定的。