python 常用的排序演算法

一個測試的夢想發表於2018-09-27

1.插入排序:插入排序的基本操作就是將一個資料插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少量資料的排序;首先將第一個作為已經排好序的,然後每次從後的取出插入到前面並排序;

def insert_sort(ilist):
    for i in range(len(ilist)):
        for j in range(i):
            if ilist[i] < ilist[j]:
                ilist.insert(j, ilist.pop(i))
                break
    return ilist
 
ilist = insert_sort([4,5,6,7,3,2,6,9,8])
print ilist

  

2.氣泡排序:它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成

def bubble_sort(blist):
    count = len(blist)
    for i in range(0, count):
        for j in range(i + 1, count):
            if blist[i] > blist[j]:
                blist[i], blist[j] = blist[j], blist[i]
    return blist
 
blist = bubble_sort([4,5,6,7,3,2,6,9,8])
print blist

  

3.快速排序:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列

def quick_sort(qlist):
    if qlist == []:
        return []
    else:
        qfirst = qlist[0]
        qless = quick_sort([l for l in qlist[1:] if l < qfirst])
        qmore = quick_sort([m for m in qlist[1:] if m >= qfirst])
        return qless + [qfirst] + qmore
 
qlist = quick_sort([4,5,6,7,3,2,6,9,8])
print qlist

 

4.選擇排序:第1趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;第2趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;以此類推,第i趟在待排序記錄r[i] ~ r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢

def select_sort(slist):
    for i in range(len(slist)):
        x = i
        for j in range(i, len(slist)):
            if slist[j] < slist[x]:
                x = j
        slist[i], slist[x] = slist[x], slist[i]
    return slist
 
slist = select_sort([4,5,6,7,3,2,6,9,8])
print slist

 5.二分查詢:主要通過除2後進行判斷查詢;

#!/usr/bin/python
# -*- coding: utf-8 -*-
#二分查詢,用於在較大的資料列表中查詢某個值,考慮到元素比較多,單純的遍歷會造成記憶體壓力過大,考慮使用二分查詢
#二分查詢的關鍵在於查詢中間值,將需要查詢的值與中間值進行比較,然後確定查詢方向
def binary_search(data_source,find_n):
    #取中位數
    mid=int(len(data_source)/2)

    if len(data_source)>=1:
        if data_source[mid]>find_n:  #中位數大於要查詢的數,則要查詢的數在左半部分,繼續呼叫二分演算法進行查詢
            binary_search(data_source[:mid],find_n)
        elif data_source[mid]<find_n:  #中位數小於要查詢的數,則要查詢的數在右半部分
            binary_search(data_source[mid:],find_n)
        else:   #中位數等於要查詢的數
            print("找到了:",data_source[mid])

    else:
        print("沒有找到")


if __name__=="__main__":
    data=list(range(3,1600))
    binary_search(data,400)

  

 

相關文章