數據結構與算法三(冒泡排序、選擇排序、插入排序)

排序:將一組“無序”的記錄序列調整爲“有序”的記錄序列(升序與降序)
列表排序:將無序列表變爲有序列表

  • 輸入:列表
  • 輸出:有序列表
  • 內置排序函數:sort()
    **常見的排序算法有:**冒泡排序、選擇排序、插入排序、快速排序、堆排序、歸併排序、希爾排序、計數排序、基數排序
    (1)冒泡排序(Bubble Sort)(原地排序)
  • 列表每兩個相鄰的數,如果前面比後面大,則交換這兩個數。
  • 一趟排序完成後,則無序區減少一個數,有序區增加一個數
  • 代碼關鍵點:趟數、無序區範圍
    時間複雜度爲O(n2)
def bubble_sortup(li):#冒泡排序升序
    for i in range(len(li)-1):#第i趟
        exchange=False#增加一個標誌位,當某一趟結束後列表順序沒有改變,說明列表已經排好
        for j in range(len(li)-1):
            if li[j]>li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
                exchange=True
            print(li)
        if not exchange:
            return

def bubble_sortdown(li):#冒泡排序降序
    for i in range(len(li)-1):
        exchange=False#增加一個標誌位,當某一趟結束後列表順序沒有改變,說明列表已經排好
        for j in range(len(li)-1-i):
            if li[j]<li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]
                 exchange=True
            print(li)
        if not exchange:
            return
                        
import random
li1=[random.randint(0,1000) for i in range(1000)]
print(li1)#列表是無序的
bubble_sortup(li1)
print(li1)#冒泡排序後變爲升序

li2=[random.randint(0,1000) for i in range(1000)]
print(li2)#列表是無序的
bubble_sortdown(li2)
print(li2)#冒泡排序後變爲降序

(2)選擇排序(Select Sort)

  • 一趟排序記錄最小的數,放到第一個位置
  • 再一趟排序記錄列表無序區最小的數,放到第二個位置
  • 算法關鍵點:有序區和無序區、無序區最小數的位置
    時間複雜度爲O(n2)
def select_sort(li):
    for i in range(len(li)-1):#i表示第幾趟
        min_loc=i
        for j in range(i+1,len(li)):
            if li[j]<li[min_loc]:
                min_loc=j
        li[i],li[min_loc]=li[min_loc],li[i]
        print(li)
        
li=[3,4,2,1,5,6,8,7,9]
print(li)
select_sort(li)

(3)插入排序

  • 初始時手裏(有序區)只有一張牌
  • 每次(從無序區)摸一張牌,插入到手裏已有牌的正確位置
  • 時間複雜度爲:O(n2)
def insert_sort(li):
    for i in range(1,len(li)):#i表示摸到牌的下標
        tmp=li[i]
        j=i-1#j指的是手裏的牌的下標
        while j>=0 and li[j]>tmp:
            li[j+1]=li[j]
            j-=1
        li[j+1]=tmp
        print(li)
li=[3,2,4,1,5,7,9,6,8]
print(li)
insert_sort(li)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章