1. 程式人生 > >python排序演算法 之 選擇、冒泡、插入排序

python排序演算法 之 選擇、冒泡、插入排序

1.選擇排序
     給定一個列表,一趟遍歷記錄最小的數,放到第一個位置,再一趟遍歷記錄剩餘列表中最小的數,繼續放置……
    1.每趟選出一個最小的,得到其索引,然後把該值和該趟的起始值作交換
    該趟最小值在確定的位置,每趟比上一趟比較的資料少一個,資料從前減少
    2.每趟的起始值編號比上一趟的起始值多一,起始編號最大到倒數第二個
    3.直到倒數第二個與倒數第一個比較結束後,程式結束,共進行n-1趟

lwst = [4,3,5,2,1,0,8]

def choose_sort(list):
	i = 0
	while i <len(lwst) - 1:
		min = i
		j = i + 1
		while j <len(lwst):
			if lwst[j] < lwst[min]:
				min = j  # 找到最小值的編號
			j += 1
		if min != i:
			lwst[min],lwst[i] = lwst[i],lwst[min]  # 將起始值與最小編號值交換
		i += 1

choose_sort(lwst)
print(lwst)  # [0, 1, 2, 3, 4, 5, 8]
def choose_sort(list):
    for i in range(len(list)):
        min = i
        for j in range (i+1 ,len(list)):
            if list[j] < list[min]:
                min = j
        if min != i:
            list[i],list[min] = list[min],list[i]

    直接選擇排序時間複雜度 O(n^2)

2.氣泡排序
        給定一個列表,列表每兩個相鄰的數,如果前邊的比後邊的大,那麼交換這兩個數!
        1.每趟挑出一個最大的值,每趟結束後會有一個數據在確定的位置,即該趟最後一位
        2.每趟資料都會減少一個,資料從後減少
        2.首先將第二個與第一個資料進行比較,直到倒數第一個與倒數第二個比較,程式結束,共進行n-1趟

#  新增裝飾器,計算排序所花費的時間


def cal_time(func):
    def wrapper(*args,**kwargs):
        t1 = time.time()
        result = func(*args, **kwargs)
        t2 = time.time()
        print("%s running time: %s secs." %(func.__name__,t2 - t1))
        return result
    return wrapper
@cal_time
def bubble_sort(list):
	n = len(list)
	while n > 1:
		exchange = False  # 新增 是否交換標記
		i = 1
		while i < n:
			if list[i] < list[i-1]:
				list[i],list[i-1] = list[i-1],list[i]  # 直接交換資料
				exchange = True  # 代表該趟發生交換
			i += 1
		if not exchange:  # 若該趟未發生交換,則表明資料已經有序,停止排序
			break
		n -= 1
bubble_sort(lwst)
print(lwst)		
def bubble_sort(list):
    for i in range(len(list) - 1):
        swap = False
        for j in range(len(list) - 1 - i):
            if list[j] > list[j+1]:
                list[j],list[j+1] = list[j+1],list[j]
                swap = True
        if not swap:
            return

       建立無序的列表序列,可以通過random模組的shuffle方法

import random
data = list(range(1000)
random.shuffle(data)

        冒泡時間複雜度 O(n^2) , 最好情況O(n)

3.插入排序
        給定一個列表,列表被分為有序區和無序區兩個部分,最初有序區只有一個元素,每次從無序區選擇一個元素,插入到有序         區的位置,直到無序區變空
        1.在最終順序確定前 無法確定資料的位置
        2.先將第一趟第一個值作為其實值,且是最小值
        3.每趟一個新的起始值,先將這個起始值儲存在一個變數裡
        4.起始值與其前一個數據比較若不交換則本趟結束,開始下一趟
        若發生交換,則再繼續向前比較,直到本趟結束
        5.直到最後一個數據參與比較,程式結束,共進行n-1趟

def insert_sort(list):
	i = 1
	while i < len(list):
		j = i-1
		insert = list[i]  # 儲存已有資料
		while j >= 0:
			if list[j] > insert:
				list[j+1] = list[j]  # 將大資料後移一位
				j -= 1
			else:
				break
		list[j+1] = insert  # 將已有資料放入空位
		i += 1
insert_sort(lwst)
print(lwst)
def insert_sort(list):
    for i in range(1,len(list) ):
        item = list[i]
        j = i -1
        while j >= 0 and item < list[j]:
            list[j+1] = list[j]
            j -= 1
        list[j+1] = item

    插入排序時間複雜度 O(n^2)