數據結構 --- 04.排序算法

一.冒泡

 

 

def sort(alist):
    length = len(alist)
    for j in range(length-1):
        for i in range(length-1-j):
            if alist[i] > alist[i+1]: 
                temp = alist[i]
                alist[i] = alist[i+1]
                alist[i+1] = temp
    return alist
alist = [3,8,5,7,6,4,1,2]
print(sort(alist))
結果爲:

[1, 2, 3, 4, 5, 6, 7, 8]

 

二.選擇

 

- 選擇排序改進了冒泡排序,每次遍歷列表只作一次交換。爲了作到這一點,
  一個選擇排序在他遍歷時尋找最大的值,並在完成遍歷後,將其放置在正確的位置。

找到最大元素,放到最後位置

 

def sort(alist):
    length = len(alist)
    
    for j in range(length-1,0,-1):
        #數據中最大元素的下標
        max_index = 0
        #該循環就能夠定位到最大元素值的索引(max_index)
        for i in range(1,j+1):
            if alist[i] > alist[max_index]:
                max_index = i
        #將最大值放置到列表最後的位置
        alist[max_index],alist[j] = alist[j],alist[max_index]
        
    return alist
alist = [3,8,5,7,6,4,1,2]
print(sort(alist))

# [1, 2, 3, 4, 5, 6, 7, 8]

 

三.插入

  - 插入排序的主要思想是每次取一個列表元素與列表中已經排序好的列表段進行比較,
而後插入從而獲得新的排序好的列表段,最終得到排序好的列表。好比,待排序列表爲
[49,38,65,97,76,13,27,49],則比較的步驟和獲得的新列表以下:
(帶有背景顏色的列表段是已經排序好的,紅色背景標記的是執行插入而且進行過交換的元素)

 

 

def sort(alist):
    for j in range(1,len(alist)):
        i = j
        while i>0:
            if alist[i] < alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]
                i = i-1
            else:
                break
    return alist
alist = [49,38,65,97,76,13,27]
print(sort(alist))

# [13, 27, 38, 49, 65, 76, 97]
 

 

四.希爾

 

def sort(alist):
    gap = len(alist) // 2
    while gap >= 1:
        for j in range(gap,len(alist)):
            i = j
            while i>0:
                if alist[i] < alist[i-gap]:
                    alist[i],alist[i-gap] = alist[i-gap],alist[i]
                    i = i-gap
                else:
                    break
        
        #縮減增量
        gap = gap//2
    return alist
alist = [49,38,65,97,76,13,27]
print(sort(alist))

# [13, 27, 38, 49, 65, 76, 97]
 

 

 

 

五.快排

 

左右假象兩個遊標

1.先讓0位置的元素爲中間值

2.從右邊開始比較,比它大的不變,小的放在前面前面遊標位置

3.小時就在從左邊開始小的不變,大的放在右邊遊標位置

4.最後中間的空位,放開始的0位置的值

 

 

 

def sort(alist,start,end):
    low = start
    high = end
    mid = alist[0]
    
    if low >= high:
        return
    
    while low < high:
        while low < high:
            #判斷的話要從右往左
            if alist[high] > mid:
                high -= 1
            else:
                alist[low] = alist[high]
                break

        while low < high:
            #判斷的話要從左往右
            if alist[low] < mid:
                low += 1
            else:
                alist[high] = alist[low]
                break
    alist[low] = mid
    
    #mid左側的子列表
    sort(alist,start,low-1)
    #mid右側的子列表
    sort(alist,low+1,end)
    
    return alist
alist = [49,38,65,97,76,13,27,55]
print(sort(alist,0,len(alist)-1))

# [13, 27, 38, 49, 13, 13, 13, 55]
相關文章
相關標籤/搜索