數據結構與算法全套精講(python版) (五)排序

常見排序算法效率對比如下:

 

 

1. 冒泡排序

如下是一輪內的完整過程:每次排序從首元素(圖裏爲左)開始,相鄰元素作比較,較大者排後,直至最大的數排到隊尾。然後對未排序部分重複操作

時間複雜度:

每輪操作O(n)次,共O(n)輪,時間複雜度O(n^2)

'冒泡排序'
def BubbleSort(arr):#順序表與鏈表都是線性表,故都使用這幾個排序方法
    n = len(arr)
    if n <= 1:
        return arr
    for i in range(n-1):#n個元素需要走n-1輪
        count = 0
        '每一輪'
        for j in range(n-1-i):  # 第i輪尚未排序的長度n-i
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                count += 1
        if 0 == count:
            return arr #若走完一輪後發現無改動,則直接結束
    return arr

arr0 = input('請輸入數列,用空格隔開:\n')
arr0 = arr0.split()
arr1 = []
for k in arr0:
    # print(type(k))
    arr1.append(int(k))#輸入的i如果不加int會認爲是字符!
print(arr1)
print(BubbleSort(arr1))

2.  選擇排序(最易想到)

簡述:每次把未排序的部分遍歷,把最小值排到該部分的首元素。

每輪操作O(n)次,共O(n)輪,時間複雜度O(n^2)

'選擇排序'
def SelectSort(arr):
    n = len(arr)
    if n <= 1:
        return arr

    for i in range(n-1):#當前未排序部分的首元素的位置索引i
        min_index = i
        for j in range(i+1, n):
            if arr[min_index] > arr[j]:
                min_index = j
        arr[i], arr[min_index] = arr[min_index], arr[i]#把當前未排序部分的最小值排到該部分的首位
    return arr

arr0 = input('請輸入數列:\n')
arr0 = arr0.split()
arr1 = []
for k in arr0:
    arr1.append(int(k))
print(arr1)
print(SelectSort(arr1))


 

3.  插入排序

簡述:先從第2個元素開始,與首元素按小到大排序。接着第3個插入到之前排好的前2個元素裏。以此類推

'插入排序'
def InsertSort(arr):
    n = len(arr)
    if n <= 1:
        return arr

    for i in range(1,n):#從第2個元素開始
        temp = arr[i]
        j = i
        while temp<arr[j-1] and j>0:#從後向前,直至遇到比temp小的
            arr[j] = arr[j-1]
            j -= 1
        arr[j] = temp
    return arr

arr0 = input('請輸入數列,用空格隔開:\n')
arr0 = arr0.split()
arr1 = []
for k in arr0:
    arr1.append(int(k))
print(arr1)
print(InsertSort(arr1))


 

4 . 希爾排序

簡述:是插入排序的高效實現,通過對插入排序減少移動次數來實現。因爲如果序列本身已基本有序,則插入排序在進行前後插入時的許多移動所需的重複操作都可以避免。

總長length,初始gap 0=length / 2,  對這gap組分別做插入排序。繼續如上操作gap1=gap0 / 2 (向下取整),繼續直至gap n = 1


 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章