python中幾種常用的排序算法-創(chuàng)新互聯(lián)

這篇文章主要介紹“python中幾種常用的排序算法”,在日常操作中,相信很多人在python中幾種常用的排序算法問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”python中幾種常用的排序算法”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

我們一直強(qiáng)調(diào)成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站對(duì)于企業(yè)的重要性,如果您也覺得重要,那么就需要我們慎重對(duì)待,選擇一個(gè)安全靠譜的網(wǎng)站建設(shè)公司,企業(yè)網(wǎng)站我們建議是要么不做,要么就做好,讓網(wǎng)站能真正成為企業(yè)發(fā)展過程中的有力推手。專業(yè)網(wǎng)站設(shè)計(jì)公司不一定是大公司,創(chuàng)新互聯(lián)作為專業(yè)的網(wǎng)絡(luò)公司選擇我們就是放心。

排序算法的運(yùn)用非常廣泛。各種語言都有自己內(nèi)置的排序函數(shù),在面試過程中也經(jīng)常會(huì)有排序算法的考題??偨Y(jié)幾種排序算法的實(shí)現(xiàn)。

這個(gè)問題的顯示表示是:請(qǐng)?jiān)敿?xì)描述如何將一組數(shù)字按從小到大的順序排列。

我首先想到的是:

  1. 找出數(shù)組中最小的一個(gè);

  2. 把這個(gè)數(shù)放到另一數(shù)組的最后面;

  3. 把這個(gè)數(shù)從原來的數(shù)組中剔除;

  4. 重復(fù)

重復(fù)的過程通常涉及到遍歷和遞歸,上面這個(gè)解法叫「選擇排序」,用 Python 實(shí)現(xiàn)如下:

def select_sort(arr):
    new_arr = []
     # 重復(fù)
    for i in range(len(arr)):
        small_index = find_smallest(arr)
         # 把這個(gè)數(shù)從原來的數(shù)組中剔除;
        smallest = arr.pop(small_index)
         # 把這個(gè)數(shù)放到另一數(shù)組的最后面;
        new_arr.append(smallest)
    return new_arr
def find_smallest(arr):
     """找出數(shù)組中最小的一個(gè);"""
    smallest = arr[0]
    index = 0
    for e in range(1,len(arr)):
        if arr[e] < smallest:
            smallest = arr[e]
            index = e
    return index

可以看出來,代碼實(shí)現(xiàn)基本上就是用編程語言寫出解題思路。所以很多編程進(jìn)階書都提到一個(gè)解決問題的辦法就是離開鍵盤,去上個(gè)廁所,在紙上畫一畫。只要是解題思路很詳細(xì),基本上是可以用來當(dāng)偽代碼使用的,可以全部放入代碼的注釋當(dāng)中。

冒泡排序(Bubble Sort)
  1. 比較前一個(gè)數(shù)和后一個(gè)數(shù),如果前比后大,對(duì)換他們的位置;

  2. 循環(huán)執(zhí)行

def bubble_sort(arr):
    for i in range(len(arr) - 1):
        for j in range(len(arr) - i - 1):
            if arr[j] > arr[j + 1]:
                tmp = arr[j + 1]
                arr[j + 1] = arr[j]
                arr[j] = tmp
    return arr
快速排序

上面兩種算法要操作的步驟很多,當(dāng)數(shù)組太多時(shí)就會(huì)造成性能過低,我們可以想辦法減少要操作的步驟,從而降低算法的復(fù)雜度,提高執(zhí)行效率。減少步驟的很多算法都是將數(shù)據(jù)分成幾部分來處理,也就是通常說的「分治」,從而不斷減少?zèng)]部分需要處理的步驟,選擇排序就是這樣一種算法:
1.選出第一個(gè)元素
2.遍歷每個(gè)元素,也就是從第二個(gè)開始拿,如果比第一個(gè)元素小,放到一個(gè)新數(shù)組里;如果比它大,放到另一個(gè)數(shù)組;
3.對(duì)兩個(gè)新數(shù)組執(zhí)行同樣的操作;
那什么時(shí)候不需要執(zhí)行這樣的操作了呢?當(dāng)數(shù)組的元素個(gè)數(shù)小于2的時(shí)候,不需要比較了,分治策略就結(jié)束。

「分治」是一種非常常見的解題思路。因?yàn)樗懿粩嗟膶栴}變成更簡(jiǎn)單的問題,最后變成一個(gè)顯而易見的事。也就是說它有兩個(gè)條件:

  • 基準(zhǔn)條件。也就是沒有辦法再分了,足夠簡(jiǎn)單了。

  • 分治條件或者叫遞歸條件。能夠進(jìn)一步縮小需要解決的問題的規(guī)模。

分治法在算法中非常普遍,不是因?yàn)樗芙档退惴ǖ膹?fù)雜度,而是他能一步步將復(fù)雜的問題變得越來越簡(jiǎn)單,規(guī)模越來越小,最后變成一個(gè)超級(jí)簡(jiǎn)單的問題,如果能進(jìn)一步抽象這種過程,就能考執(zhí)行同樣的抽象步驟解出來來。分治法經(jīng)常和遞歸用在一起,這就衍生了一種變成方式——函數(shù)式編程,如果能多接觸一些遞歸的案例,對(duì)于函數(shù)式變成和抽象是非常有幫助的。軟件設(shè)計(jì)就是講一個(gè)非常復(fù)雜的問題抽象的過程,所以掌握函數(shù)式編程和遞歸概念對(duì)于抽象能力和軟件設(shè)計(jì)應(yīng)該是很有幫助的。

下面實(shí)現(xiàn)快速排序:

def quick(arr):
    if len(arr) < 2:
        return arr
    else:
        base = arr[0]
        less = [i for i in arr[1:] if i < base]
        greater = [i for i in arr[1:] if i >= base]
        return quick(less) + [base] + quick(greater)
歸并排序

歸并排序和選擇排序一樣是一種分治遞歸策略:

  1. 從中間分成兩組

  2. 將兩個(gè)已經(jīng)排序好的列表進(jìn)行合并,合并成的列表就是排序好的
    那怎么對(duì)上述兩個(gè)列表排序呢?對(duì)兩個(gè)列表再執(zhí)行分組策略
    什么時(shí)候不能繼續(xù)了呢?當(dāng)元素個(gè)數(shù)小于 2 的時(shí)候

具體實(shí)現(xiàn):

def merge_sort(arr):
    # divide to two
    if len(arr) < 2:
        return arr
    mid = int(len(arr)/2)
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])
    return merge(left, right)
def merge(left, right):
    result = []
    j = 0
    i = 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    # add the larger part both left and right
    result += left[i:]
    result += right[j:]
    return result

到此,關(guān)于“python中幾種常用的排序算法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

網(wǎng)頁名稱:python中幾種常用的排序算法-創(chuàng)新互聯(lián)
文章來源:http://muchs.cn/article16/djisdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣、品牌網(wǎng)站制作網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作