数据结构与算法三(冒泡排序、选择排序、插入排序)

排序:将一组“无序”的记录序列调整为“有序”的记录序列(升序与降序)
列表排序:将无序列表变为有序列表

  • 输入:列表
  • 输出:有序列表
  • 内置排序函数: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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章