1. 程式人生 > >資料結構之內部排序--簡單選擇排序

資料結構之內部排序--簡單選擇排序

目錄

概要

-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]