資料結構之內部排序--簡單選擇排序
阿新 • • 發佈:2018-11-13
目錄
概要
-IDE:Pycharm
-Python版本:python3.x
-演算法分類:內部排序->選擇類排序->簡單選擇排序
演算法思想
第一趟簡單選擇排序時,從第一個記錄開始,通過$n-1$次關鍵字比較,從$n$個記錄中選出關鍵字最小的記錄,並和第一個記錄進行交換。
第二趟,從第二個記錄開始,通過$n-2$次比較,選出最小的與第二個記錄交換。
反覆如此,經過$n-1$次簡單選擇排序,將把$n-1$個記錄排到位,剩下的一個最小記錄直接在最後,所以共需進行$n-1$趟簡單選擇排序。
演算法分析
最好情況下,即待排序記錄初始狀態是正序,則不需要移動記錄,最壞情況是倒序,此時移動的最多為$3(n-1)$次。
簡單選擇排序過程中需要進行的比較次數與初始狀態無關,總共需要比較$\sum_{i=1}^{n-1}=(n-1)+(n-2)+...+1= \frac{n(n-1)}{2}$
穩定性與時間複雜度
排序演算法 | 穩定性 | 時間複雜度 | 最好情況 | 最壞情況 | 空間複雜度 |
---|---|---|---|---|---|
簡單選擇 | 不穩定 | $O(n^2)$ | $O(n^2)$ | $O(n^2)$ | $O(1)$ |
Python程式碼清單
# !/usr/bin/python3 # _*_ coding:utf-8 _*_ # 選擇排序。 import sys, time, random def SS(number, maxNumber): timeStart = time.time() # 記錄開始時間。 listA = [] # 設定list容器 for i in range(number): # 迴圈生成列表元素 listA.append(random.randint(0, maxNumber)) # 新增到列表 timeEnd = time.time() # 記錄結束時間 tiemIs = timeEnd-timeStart # 計算耗時 print('生成%d個數花費的時間是%f' % (number, tiemIs)) # 列印資訊。 # print(listA) # 列印生成的列表。 ############################################################ # 快速排序。 # aim = 0 # aim 用於儲存找到的最小值。 timeStart = time.time() # 記錄開始時間。 for item in range(number-1): # 外層迴圈, i = item # 記錄當前元素位置,也是目標位置,也是第一個比較元素。 temp = listA[i] # 記錄當前元素的值 for item2 in range(item+1, number): # 內層迴圈。 if listA[item2] < listA[i]: # 判斷的大小。 i = item2 # 更新比較元素。 listA[item] = listA[i] # 將最小的元素放到目標位 listA[i] = temp # 將目標位的元素送到當前位。 # print(listA[item]) timeEnd = time.time() # 記錄結束時間。 timeIs = timeEnd - timeStart # 計算消耗時間。 print('排序%d個數花費的時間是%f' % (number, timeIs)) # 列印輸出相關資訊。 # print(listA) # 列印輸出列表。 if __name__ == '__main__': helpInfo = ''' This program is for Select Sort. How to use it! Follow the example! python Select_Sort.py 10 100 The 10 representative will generate ten numbers. 100 representative the max-number you make. ''' command = sys.argv[0:] # 從鍵盤上獲取輸入。 if len(command) != 3 or 'help' in command: # 判斷輸入是否合法,或者有請求幫助的詞。 print(helpInfo) # 列印幫助語句。 else: try: number = int(command[1]) # 嘗試將字元轉化為int型數值。 maxNumber = int(command[2]) except ValueError: # 轉化失敗,發生ValueError。 print(helpInfo) # 列印幫助文字。 sys.exit(1) # 以異常的方式退出程式 SS(number, maxNumber) # 一切正常,開始呼叫函式。
有什麼問題請聯絡我
QQ:3116316431 (請附上資訊)
E-mail:[email protected]