排序算法分享

排序算法分享

概述

算法分類

十種常見排序算法能夠分爲兩大類:python

  • 非線性時間比較類排序: 經過比較來決定元素間的相對次序,因爲其時間複雜度不能突破O(nlogn),所以稱爲非線性時間比較類排序。
  • 線性時間非比較類排序: 不經過比較來決定元素間的相對次序,它能夠突破基於比較排序的時間下界,以線性時間運行,所以稱爲線性時間非比較類排序。

算法複雜度

相關概念

穩定: 若是a本來在b前面,而a=b,排序以後a仍然在b的前面。
不穩定: 若是a本來在b的前面,而a=b,排序以後 a 可能會出如今 b 的後面。算法

時間複雜度: 對排序數據的總的操做次數。反映當n變化時,操做次數呈現什麼規律。
空間複雜度: 是指算法在計算機內執行時所需存儲空間的度量,它也是數據規模n的函數。數組

冒泡排序(Bubble Sort)

冒泡排序是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,若是它們的順序錯誤就把它們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。函數

算法原理

  1. 比較相鄰的元素。若是第一個比第二個大,就交換它們兩個;
  2. 對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
  3. 針對全部的元素重複以上的步驟,除了最後一個;
  4. 重複步驟1~3,直到排序完成。

代碼實現

def bubble_sort(L):
    i = 0
    flag = True
    length = len(L)

    while i < length and flag:
        j = length - 1
        flag = False

        while j > i:
            if L[j - 1] > L[j]:
                L[j - 1], L[j] = L[j], L[j - 1]
            flag = True
            j = j - 1

        i = i + 1

選擇排序(Selection Sort)

選擇排序(Selection-sort)是一種簡單直觀的排序算法。它的工做原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,而後,再從剩餘未排序元素中繼續尋找最小(大)元素,而後放到已排序序列的末尾。以此類推,直到全部元素均排序完畢。code

選擇排序是表現最穩定的排序算法之一,由於不管什麼數據進去都是O(n2)的時間複雜度,因此用到它的時候,數據規模越小越好。惟一的好處可能就是不佔用額外的內存空間了吧。理論上講,選擇排序可能也是平時排序通常人想到的最多的排序方法了吧。blog

算法原理

n個記錄的直接選擇排序可通過n-1趟直接選擇排序獲得有序結果。具體算法描述以下:排序

  1. 初始狀態:無序區爲R[1..n],有序區爲空;
  2. 第i趟排序(i=1,2,3…n-1)開始時,當前有序區和無序區分別爲R[1..i-1]和R(i..n)。該趟排序從當前無序區中-選出關鍵字最小的記錄 R[k],將它與無序區的第1個記錄R交換,使R[1..i]和R[i+1..n)分別變爲記錄個數增長1個的新有序區和記錄個數減小1個的新無序區;
  3. n-1趟結束,數組有序化了。

代碼實現

def selection_sort(L):
    i = 0
    length = len(L)

    while i < length - 1:
        min = i
        j = i + 1

        while j < len(L):
            if L[min] > L[j]:
                min = j
            j = j + 1

        if i != min:
            L[i], L[min] = L[min], L[i]

        i = i + 1

插入排序(Insertion Sort)

插入排序(Insertion-Sort)的算法描述是一種簡單直觀的排序算法。它的工做原理是經過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。內存

算法原理

通常來講,插入排序都採用in-place在數組上實現。具體算法描述以下:io

  1. 從第一個元素開始,該元素能夠認爲已經被排序;
  2. 取出下一個元素,在已經排序的元素序列中從後向前掃描;
  3. 若是該元素(已排序)大於新元素,將該元素移到下一位置;
  4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;
  5. 將新元素插入到該位置後;
  6. 重複步驟2~5。

代碼實現

def insertion_sort(L):
    for i in range(1, len(L)):
        # 若下標爲i的元素小於下標爲i-1的元素,則將下標爲i的元素放到合適位置
        if L[i] < L[i - 1]:
            tmp = L[i]
            j = i - 1
            # 尋找a[i]的合適位置,並將a[i-1]至a[i]新位置的元素依次後移
            while j >= 0 and tmp < L[j]:
                L[j + 1] = L[j]
                j = j - 1

            # 將a[i]放到新位置
            L[j + 1] = tmp
相關文章
相關標籤/搜索