Python實(shí)現(xiàn)排序算法

冒泡排序

一匈仗、排序流程

  • 1.比較相鄰的元素瓢剿。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)悠轩。
  • 2.對每一對相鄰元素做同樣的工作间狂,從開始第一對到結(jié)尾的最后一對。在這一點(diǎn)火架,最后的元素應(yīng)該會(huì)是最大的數(shù)鉴象。
  • 3.針對所有的元素重復(fù)以上的步驟,除了最后一個(gè)何鸡。
  • 4.持續(xù)每次對越來越少的元素重復(fù)上面的步驟纺弊,直到?jīng)]有任何一對數(shù)字需要比較。
最好時(shí)間復(fù)雜度 最壞時(shí)間復(fù)雜度 平均時(shí)間復(fù)雜度
O(n) O(n^2) O(n^2)
def bubble_sort(nums):
    length = len(nums)
    for i in range(length):
        for j in range(1, length - i):
            if nums[j - 1] > nums[j]:
                nums[j], nums[j-1] = nums[j - 1], nums[j]
    return nums

二骡男、選擇排序

def find_smallest(nums):
    smallest = nums[0]
    smallest_index = 0
    for index, num in enumerate(nums):
        if num < smallest:
            smallest = num
            smallest_index = index
    return smallest_index

def select_sort(nums):
    sorted_nums = []
    while len(nums) > 0:
        smallest_index = find_smallest(nums)
        smallest_num = nums.pop(smallest_index)
        sorted_nums.append(smallest_selected)
    return sorted_nums
最好時(shí)間復(fù)雜度 最壞時(shí)間復(fù)雜度 平均時(shí)間復(fù)雜度
O(n^2) O(n^2) O(n^2)

三淆游、插入排序

  • 插入排序是指在待排序的元素中,假設(shè)前面n-1(其中n>=2)個(gè)數(shù)已經(jīng)是排好順序的隔盛,現(xiàn)將第n個(gè)數(shù)插到前面已經(jīng)排好的序列中犹菱,然后找到合適自己的位置,使得插入第n個(gè)數(shù)的這個(gè)序列也是排好順序的吮炕。按照此法對所有元素進(jìn)行插入腊脱,直到整個(gè)序列排為有序的過程,稱為插入排序
def insert_sort(nums):
    for index, num in enumerate(nums):
        pointer = index
        while pointer > 0 and nums[pointer] > num:
            nums[pointer] = nums[pointer - 1]
            pointer -= 1
        nums[pointer] = num
    return nums
最好時(shí)間復(fù)雜度 最壞時(shí)間復(fù)雜度 平均時(shí)間復(fù)雜度
O(n) O(n^2) O(n^2)

四龙亲、希爾排序

  • 1.算法先將要排序的一組數(shù)按某個(gè)增量d分成若干組陕凹,每組中記錄的下標(biāo)相差d.對每組中全部元素進(jìn)行排序,然后再用一個(gè)較小的增量對它進(jìn)行鳄炉,在每組中再進(jìn)行排序捆姜。當(dāng)增量減到1時(shí),整個(gè)要排序的數(shù)被分成一組迎膜,排序完成。

  • 2.一般的初次取序列的一半為增量浆兰,以后每次減半磕仅,直到增量為1。

def shell_sort(nums):
    length = len(nums)
    gap = length // 2
    while gap > 0:
        for i in range(gap, length):
            temp = nums[i]
            j = i
            while j >= gap and num[j - gap] > temp:
                j -= gap
            nums[j] = temp
        gap = gap // 2
    return nums
最好時(shí)間復(fù)雜度 最壞時(shí)間復(fù)雜度 平均時(shí)間復(fù)雜度
O(n^1.3) O(n^2) -
希爾排序

五簸呈、歸并排序

歸并排序(Merge Sort)是建立在歸并操作上的一種有效榕订,穩(wěn)定的排序算法,該算法是采用分治法的一個(gè)非常典型的應(yīng)用蜕便。將已有序的子序列合并劫恒,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序两嘴。若將兩個(gè)有序表合并成一個(gè)有序表丛楚,稱為二路歸并

def merge(left, right):
    result = []
    while left and right:
        if left[0] < right[0]:
            result.append(left.pop(0))
        else:
            result.append(right.pop(0))
    if left:
        result += left
    if right:
        result  += right
    return result
def merge_sort(nums):
    if len(nums) <= 1:
        return nums
    mid = len(nums) // 2
    left = nums[:mid]
    right = nums[mid:]
    left = merge_sort(left)
    right = merge_sort(right)
    return merge(left, right)
最好時(shí)間復(fù)雜度 最壞時(shí)間復(fù)雜度 平均時(shí)間復(fù)雜度 穩(wěn)定性
O(nlogn) O(nlogn) O(nlogn) 穩(wěn)定

六憔辫、快速排序

  • 1.首先設(shè)定一個(gè)分界值趣些,通過該分界值將數(shù)組分成左右兩部分。

  • 2.將大于或等于分界值的數(shù)據(jù)集中到數(shù)組右邊贰您,小于分界值的數(shù)據(jù)集中到數(shù)組的左邊坏平。此時(shí),左邊部分中各元素都小于或等于分界值锦亦,而右邊部分中各元素都大于或等于分界值舶替。

  • 3.然后,左邊和右邊的數(shù)據(jù)可以獨(dú)立排序杠园。對于左側(cè)的數(shù)組數(shù)據(jù)顾瞪,又可以取一個(gè)分界值,將該部分?jǐn)?shù)據(jù)分成左右兩部分返劲,同樣在左邊放置較小值玲昧,右邊放置較大值。右側(cè)的數(shù)組數(shù)據(jù)也可以做類似處理篮绿。

  • 4.重復(fù)上述過程孵延,可以看出,這是一個(gè)遞歸定義亲配。通過遞歸將左側(cè)部分排好序后尘应,再遞歸排好右側(cè)部分的順序。當(dāng)左吼虎、右兩個(gè)部分各數(shù)據(jù)排序完成后犬钢,整個(gè)數(shù)組的排序也就完成了。

def quick_sort(nums):
    if len(nums) <= 1:
        return nums
    pivot = nums[0]
    less = [i for i in nums[1:] if i <= pivot]
    greater = [i for i in nums[i:] if i > pivot]
    return quick_sort(less) + [pivot] + quick_sort(greater)
class QuickSort:
    def quick_sort(self, nums):
        self.random_quicksort(nums, left, right)
        return nums
    def random_quicksort(self, nums, left, right):
        if left >= right:
            return
        pivot = self.random_paritition(nums, left, right)
        self.random_quicksort(nums, left, pivot - 1)
        self.random_quicksort(nums, pivot + 1, right)
    def random_partition(self, nums, left, right):
        pivot = random.randint(left, right)
        nums[right], nums[pivot] = nums[pivot], nums[right]
        i = left - 1
        for j in range(left, right):
            if nums[j] < nums[right]:
                i += 1
                nums[i], nums[j] = nums[j], nums[i]
        i += 1
        nums[i], nums[right] = nums[right], nums[i]
        return i
最好時(shí)間復(fù)雜度 最壞時(shí)間復(fù)雜度 平均時(shí)間復(fù)雜度
O(nlogn) O(n^2) O(nlogn)

七思灰、堆排序

heapSort.gif
def build_heap(nums, length, i):
    largest = i
    left = 2 * i + 1
    right = 2 * i + 1
    
def heap_sort(nums):
    length = len(nums)
    for i in range(length, -1, -1):
        build_heap(nums, length, i)


八玷犹、計(jì)數(shù)排序

def counting_sort(nums, max):  # maxnumber為數(shù)組中的最大值
    length = len(nums)
    if length <= 1:
        return nums
    count_array= [0] * (max + 1)
    for num in nums:
        count_array[num] += 1
    result = []
    for i in range(max + 1):
        for j in range(count_array[i]):
            result.append(i)
    return result
計(jì)數(shù)排序的時(shí)間復(fù)雜度 基于比較的排序時(shí)間復(fù)雜度下限
O(n + k)k是整數(shù)范圍 O(nlogn)

若O(k) > O(nlogn)時(shí)其效率反而不如基于比較的排序

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市洒疚,隨后出現(xiàn)的幾起案子歹颓,更是在濱河造成了極大的恐慌,老刑警劉巖油湖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巍扛,死亡現(xiàn)場離奇詭異,居然都是意外死亡乏德,警方通過查閱死者的電腦和手機(jī)撤奸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門吠昭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胧瓜,你說我怎么就攤上這事矢棚。” “怎么了贷痪?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵幻妓,是天一觀的道長。 經(jīng)常有香客問我劫拢,道長肉津,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任舱沧,我火速辦了婚禮妹沙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熟吏。我一直安慰自己距糖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布牵寺。 她就那樣靜靜地躺著悍引,像睡著了一般。 火紅的嫁衣襯著肌膚如雪帽氓。 梳的紋絲不亂的頭發(fā)上趣斤,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音黎休,去河邊找鬼浓领。 笑死,一個(gè)胖子當(dāng)著我的面吹牛势腮,可吹牛的內(nèi)容都是我干的联贩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼捎拯,長吁一口氣:“原來是場噩夢啊……” “哼泪幌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起署照,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤祸泪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后藤树,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拓萌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年岁钓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屡限,死狀恐怖品嚣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钧大,我是刑警寧澤翰撑,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站啊央,受9級(jí)特大地震影響眶诈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓜饥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一逝撬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乓土,春花似錦宪潮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至食磕,卻和暖如春尽棕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背芬为。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工萄金, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人媚朦。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓氧敢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親询张。 傳聞我的和親對象是個(gè)殘疾皇子孙乖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容