色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python最簡單實現快速排序的辦法

馬哥Linux運維 ? 來源:裸睡的豬 ? 作者:豬哥 ? 2020-01-01 15:02 ? 次閱讀

一、算法介紹

排序算法(Sorting algorithm)是計算機科學最古老、最基本的課題之一。要想成為合格的程序員,就必須理解和掌握各種排序算法。其中”快速排序”(Quicksort)使用得最廣泛,速度也較快。它是圖靈獎得主C. A. R. Hoare(托尼·霍爾)于1960時提出來的。

二、算法原理

快排的實現方式多種多樣,豬哥給大家寫一種容易理解的:分治+迭代,只需要三步:

在數列之中,選擇一個元素作為”基準”(pivot),或者叫比較值。

數列中所有元素都和這個基準值進行比較,如果比基準值小就移到基準值的左邊,如果比基準值大就移到基準值的右邊

以基準值左右兩邊的子列作為新數列,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。

舉個例子,假設我現在有一個數列需要使用快排來排序:{3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48},我們來看看使用快排的詳細步驟:

選取中間的26作為基準值(基準值可以隨便選)

數列從第一個元素3開始和基準值26進行比較,小于基準值,那么將它放入左邊的分區中,第二個元素44比基準值26大,把它放入右邊的分區中,依次類推就得到下圖中的第二列。

然后依次對左右兩個分區進行再分區,得到下圖中的第三列,依次往下,直到最后只有一個元素

分解完成再一層一層返回,返回規則是:左邊分區+基準值+右邊分區

三、代碼實現

quick_sort = lambda array: array if len(array) 《= 1 else quick_sort([item for item in array[1:] if item 《= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item 》 array[0]])

是不是很簡潔很秀,如果再有面試官讓你手寫一個快排,你就把這行寫上去吧,面試官見了都要喊你秀兒,哈哈。

在你感嘆python炫酷吊炸天的同時,你因該考慮到代碼的可讀性問題,lambda函數設計是為了代碼的簡潔性,但是濫用的話會導致可讀性變得極差,而且現在pep8代碼規范中也不建議使用lambda函數了,建議使用關鍵字def去定義一個函數,所以下面豬哥給大家寫一段符合pythonic風格的快排代碼

def quick_sort(arr): “”“快速排序”“” if len(arr) 《 2: return arr # 選取基準,隨便選哪個都可以,選中間的便于理解 mid = arr[len(arr) // 2] # 定義基準值左右兩個數列 left, right = [], [] # 從原始數組中移除基準值 arr.remove(mid) for item in arr: # 大于基準值放右邊 if item 》= mid: right.append(item) else: # 小于基準值放左邊 left.append(item) # 使用迭代進行比較 return quick_sort(left) + [mid] + quick_sort(right)

四、算法分析

穩定性:快排是一種不穩定排序,比如基準值的前后都存在與基準值相同的元素,那么相同值就會被放在一邊,這樣就打亂了之前的相對順序

比較性:因為排序時元素之間需要比較,所以是比較排序

時間復雜度:快排的時間復雜度為O(nlogn)

空間復雜度:排序時需要另外申請空間,并且隨著數列規模增大而增大,其復雜度為:O(nlogn)

歸并排序與快排 :歸并排序與快排兩種排序思想都是分而治之,但是它們分解和合并的策略不一樣:歸并是從中間直接將數列分成兩個,而快排是比較后將小的放左邊大的放右邊,所以在合并的時候歸并排序還是需要將兩個數列重新再次排序,而快排則是直接合并不再需要排序,所以快排比歸并排序更高效一些,可以從示意圖中比較二者之間的區別。

五、快排優化

快速排序有一個缺點就是對于小規模的數據集性能不是很好。可能有人認為可以忽略這個缺點不計,因為大多數排序都只要考慮大規模的適應性就行了。但是快速排序算法使用了分治技術,最終來說大的數據集都要分為小的數據集來進行處理,所以快排分解到最后幾層性能不是很好,所以我們就可以使用揚長避短的策略去優化快排:

先使用快排對數據集進行排序,此時的數據集已經達到了基本有序的狀態

然后當分區的規模達到一定小時,便停止快速排序算法,而是改用插入排序,因為我們之前講過插入排序在對基本有序的數據集排序有著接近線性的復雜度,性能比較好。

這一改進被證明比持續使用快速排序算法要有效的多,下期豬哥就會帶大家實際測試這幾種算法的性能。

六、模擬面試

面試官:你了解快排嗎?

你:略知一二

面試官:那你講講快排的算法思想吧

你:快排基本思想是:從數據集中選取一個基準,然后讓數據集的每個元素和基準值比較,小于基準值的元素放入左邊分區大于基準值的元素放入右邊分區,最后以左右兩邊分區為新的數據集進行遞歸分區,直到只剩一個元素。

面試官:快排有什么優點,有什么缺點?

你:分治思想的排序在處理大數據集量時效果比較好,小數據集性能差些。

面試官:那該如何優化?

你:對大規模數據集進行快排,當分區的規模達到一定小時改用插入排序,插入排序在小數據規模時排序性能較好。

面試官:那你能手寫一個快排嗎?

你:

quick_sort = lambda array: array if len(array) 《= 1 else quick_sort([item for item in array[1:] if item 《= array[0]]) + [array[0]] + quick_sort([item for item in array[1:] if item 》 array[0]])

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 排序算法
    +關注

    關注

    0

    文章

    53

    瀏覽量

    10077
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84752

原文標題:Python一行代碼實現快速排序

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Python實現的常見內部排序算法

    排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因
    發表于 07-06 12:35 ?358次閱讀
    <b class='flag-5'>Python</b><b class='flag-5'>實現</b>的常見內部<b class='flag-5'>排序</b>算法

    matlab實現快速排序法(原創)

    使用快速排序法進行排序,本以為很簡單就可以實現,但搜索了一下help文檔,只有C中的qsort存在,況且調用比較麻煩,其實在數據結構中,
    發表于 08-15 11:33

    matlab快速排序算法實現

    只有C中的qsort存在,調用比較麻煩,其實在數據結構中,快速排序法是經典排序之一,上網搜了一下簡介,把對應的VC程序改了一下,做成了下面的matlab代碼:%快速
    發表于 02-29 15:58

    快速學習Python的技巧

    )有很多老的Python排序代碼,它們在你創建一個自定義的排序時花費你的時間,但在運行時確實能加速執行排序過程。元素排序的最好方法是盡可能使
    發表于 07-27 14:58

    python排序得出序號各類的方法

    python排序、得出序號各類方法大全 numpy pandas
    發表于 06-13 10:21

    C#實現快速排序

    快速排序法是對冒泡排序的一種改進。它的基本思想是,通過一趟排序將待排序記錄分割成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分記錄的關鍵字
    發表于 08-09 17:57 ?16次下載

    C語言實現簡單的基數排序

    本文主要闡述的類容是C語言實現簡單的基數排序。基數排序是一種分配排序,其基本思想是:排序過程無須
    發表于 02-05 14:57 ?1792次閱讀
    C語言<b class='flag-5'>實現</b><b class='flag-5'>簡單</b>的基數<b class='flag-5'>排序</b>

    快速排序是一種交換排序

    快速排序在每次分割的過程中,需要 1 個空間存儲基準值。而快速排序的大概需要 Nlog2N次的分割處理,所以占用空間也是 Nlog2N 個。
    的頭像 發表于 07-27 14:49 ?2927次閱讀
    <b class='flag-5'>快速</b><b class='flag-5'>排序</b>是一種交換<b class='flag-5'>排序</b>

    各種排序算法的分析及java&python實現

    排序大的分類可以分為兩種:內排序和外排序。在排序過程中,全部記錄存放在內存,則稱為內排序,如果排序
    的頭像 發表于 02-28 16:14 ?1803次閱讀
    各種<b class='flag-5'>排序</b>算法的分析及java&<b class='flag-5'>python</b><b class='flag-5'>實現</b>

    Python中的排序

    另外一種排序方法是 sorted ,此方法不是原地排序,以第一個值進行排序,同樣也是默認升序排序
    的頭像 發表于 09-07 16:25 ?2182次閱讀
    <b class='flag-5'>Python</b>中的<b class='flag-5'>排序</b>

    python實現簡單爬蟲的資料說明

    本文檔的主要內容詳細介紹的是python實現簡單爬蟲的資料說明。
    發表于 11-02 17:53 ?21次下載
    <b class='flag-5'>python</b><b class='flag-5'>實現</b><b class='flag-5'>簡單</b>爬蟲的資料說明

    DN401-電源排序變得簡單

    DN401-電源排序變得簡單
    發表于 04-15 20:50 ?7次下載
    DN401-電源<b class='flag-5'>排序</b>變得<b class='flag-5'>簡單</b>

    C語言排序快速排序的技巧

    快速排序是由東尼·霍爾所發展的一種排序算法。在平均狀況下,排序 n 個項目要Ο(n log n)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況并不常見。事實上,
    的頭像 發表于 07-29 15:14 ?2489次閱讀
    C語言<b class='flag-5'>排序</b>中<b class='flag-5'>快速</b><b class='flag-5'>排序</b>的技巧

    php版冒泡排序是如何實現的?

    無論學習哪一種編程語言,進行算法方面的訓練時都繞不開“排序”。排序在進階編程中有非常廣泛的應用,要想成為編程高手,排序算法是必須要掌握的。而冒泡排序算法作為一種交換
    的頭像 發表于 01-20 10:39 ?948次閱讀
    php版冒泡<b class='flag-5'>排序</b>是如何<b class='flag-5'>實現</b>的?

    python升序和降序排序代碼

    Python是一種簡潔而強大的編程語言,提供了許多實用的函數和方法來排序數據。在本文中,我們將詳細討論Python中的升序和降序排序。我們將深入探討不同的
    的頭像 發表于 11-21 15:20 ?3278次閱讀
    主站蜘蛛池模板: 恋夜秀场支持安卓版全部视频国产| 人妻换人妻AA视频| 午夜性爽视频男人的天堂在线| 电影日本妻子| 性色欲情网站IWWW| 久久久无码精品亚洲日韩按摩| 97免费观看视频| 色综合a在线| 久久精品国产亚洲AV天美18| 99久久无码一区人妻A片蜜| 谁有成人网站地址| 九九精品视频在线播放| 99欧美精品| 亚洲国产精品嫩草影院久久| 凌馨baby| 国产精品永久免费视频| 最近最新的日本字幕MV| 色欲国产麻豆一精品一AV一免费| 国产亚洲精品首页在线播放 | 午夜免费福利小电影| 久久精品国产在热亚洲| 成人短片迅雷下载| 亚洲视频免费| 日日夜夜天天操| 恋夜秀场支持安卓版全部视频国产 | 精品一卡2卡三卡4卡乱码精品视频| BT7086福利二区最新| 亚洲精品电影久久久影院| 欧美精品中文字幕亚洲专区| 好吊日视频在线| 粗暴玩烂货调教| 2021国产精品视频一区| 亚洲AV蜜桃永久无码精品红樱桃| 欧美高清视频www夜色资源网| 国内国外精品影片无人区| 成人国产三级在线播放| 中文字幕无码A片久久| 午夜福利免费院| 日本漂亮妈妈7观整有限中| 麻婆豆腐传媒视频免费| 黑色丝袜在线观看|