1. 程式人生 > >資料結構之內部排序--氣泡排序

資料結構之內部排序--氣泡排序

概要

-IDE:Pycharm
-Python版本:python3.x
-演算法分類:內部排序->交換類排序->氣泡排序

演算法思想

反覆掃描待排序記錄序列,在掃描過程中順次比較相鄰元素,若逆序則交換位置。
以升序為例:在第一趟氣泡排序中,從第一個記錄開始,掃描整個待排序列,若相鄰逆序,交換位置。掃描過程中,不停的將較大的關鍵字向後移,最大的數字必然在第一趟之後排到最後
對前$n-1$個序列進行同樣的操作,其結果是使次大的數字排到第$n-1$的位置上。直到$n=1$排序完畢。

演算法分析

氣泡排序演算法的最壞情況是待排序列記錄按關鍵字逆序排序列,此時第$i$趟氣泡排序需進行$n-i$次比較,$3(n-i)$次移動。經過$n-1$趟排序之後,總的比較次數為$\sum_{i=1}^{n-1}n-i=n(n-1)/2$,總的移動次數為$3n(n-1)/2次。

穩定性與時間複雜度

排序演算法 穩定性 時間複雜度 最好情況 最壞情況 空間複雜度
氣泡排序 穩定 $O(n^2)$ $O(n)$ $O(n^2)$ $O(1)$

Python程式碼清單

# !/usr/bin/python3
# _*_ coding:utf-8 _*_
# 氣泡排序

import time, sys, random


def BS(number,maxNumber):
    # 生成隨機數
    timeStart = time.time()  # 記錄開始時間
    listA = []  # 空的列表,用於存放生成的隨機數。
    for i in range(0, number):  #開始生成隨機數
        listA.append(random.randint(0, maxNumber))
    timeEnd = time.time()  # 結束時間
    timeIs = timeEnd - timeStart  # 生成隨機數花費的時間。
    print('生成%d個數花費的時間是%f' % (number, timeIs))
    print(listA)
    ####################################################
    #氣泡排序演算法
    timeStart = time.time()
    for itme in range(number):  # 外層的迴圈,從零開始迴圈
        for itme2 in range(0, number-1-itme):  # 內層迴圈,從0開始迴圈。切記迴圈到陣列元素個數減一。否則會out of index
            if listA[itme2] > listA[itme2+1]:  # 判斷大小
                mid = listA[itme2+1]  # 中間變數
                listA[itme2+1] = listA[itme2]  # 賦值給後一個變數
                listA[itme2] = mid  # 複製給前一個變數

    timeEnd = time.time()
    timeIs = timeEnd - timeStart
    print(listA)  # 輸出排好的list
    print('排序%d個數花費的時間是%f' % (number, timeIs))


if __name__ == '__main__':

    helpInfo = '''
              This program is for Bubble Sort.
              How to use it! Follow the example!

              python Bubble_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:  # 驗證引數是否時三個和是否有‘help’存在
        print(helpInfo)  # 列印幫助
    else:
        try:
            number = int(command[1])  # 嘗試將輸入轉化為int型,這個是產生隨機數的總個數
            maxNumber = int(command[1])  # 這個事產生隨機數的最大數。
        except ValueError:  # 檢測到值錯誤
            print(helpInfo)  # 列印幫助文字
            sys.exit(1)  # 退出程式
        BS(number, maxNumber)  # 若以上都無誤,呼叫氣泡排序演算法。

有什麼問題請聯絡我

QQ:3116316431 (請附上資訊)
E-mail:[email protected]