日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实现快速排序的算法_排序算法-快速排序

發布時間:2025/4/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现快速排序的算法_排序算法-快速排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

快速排序是由東尼霍爾所發展的一種排序算法。在平均n個項目要Ο(nlogn) 次比較。在最壞狀況下則需要 Ο(n2) 次比較,但這種狀況并不常見。事實上,快速排序通常明顯比其他 Ο(nlogn) 算法更快,因為它的內部循環(inner loop)可以在大部分的架構上很有效率地被實現出來。

快速排序使用分治法(Divide and conquer)策略來把一個串行(list)分為兩個子串行(sub-lists)。

快速排序又是一種分而治之思想在排序算法上的典型應用。本質上來看,快速排序應該算是在冒泡排序基礎上的遞歸分治法。

算法步驟:

  • 從數列中挑出一個元素,稱為 “基準”(pivot);
  • 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的后面(相同的數可以到任一邊)。在這個分區退出之后,該基準就處于數列的中間位置。這個稱為分區(partition)操作;
  • 遞歸地(recursive)把小于基準值元素的子數列和大于基準值元素的子數列排序
  • 具體實現有兩種方法:

  • 挖坑法
  • 指針交換法
  • 挖坑法

    給定一組原始數列,要求從小到大排序:

    首先,我們選定基準元素Pivot,并記住這個位置index,這個位置相當于一個“坑”。并且設置兩個指針left和right,指向數列的最左和最右兩個元素:

    接下來,從right指針開始,把指針所指向的元素和基準元素做比較。如果比pivot大,則right指針向左移動;如果比pivot小,則把right所指向的元素填入坑中。

    在當前數列中,1<4,所以把1填入基準元素所在位置,也就是坑的位置。這時候,元素1本來所在的位置成為了新的坑。同時,left向右移動一位。

    此時,left左邊綠色的區域代表著小于基準元素的區域。

    接下來,我們切換到left指針進行比較。如果left指向的元素小于pivot,則left指針向右移動;如果元素大于pivot,則把left指向的元素填入坑中。

    在當前數列中,7>4,所以把7填入index的位置。這時候元素7本來的位置成為了新的坑。同時,right向左移動一位。

    此時,right右邊橙色的區域代表著大于基準元素的區域。

    下面按照剛才的思路繼續排序:

    8>4,元素位置不變,right左移

    2<4,用2來填坑,left右移,切換到left。

    6>4,用6來填坑,right左移,切換到right。

    3<4,用3來填坑,left右移,切換到left。

    5>4,用5來填坑,right右移。這時候left和right重合在了同一位置。

    這時候,把之前的pivot元素,也就是4放到index的位置。此時數列左邊的元素都小于4,數列右邊的元素都大于4,這一輪交換終告結束。

    指針交換法:

    給定原始數列如下,要求從小到大排序:

    開局和挖坑法相似,我們首先選定基準元素Pivot,并且設置兩個指針left和right,指向數列的最左和最右兩個元素:

    接下來是第一次循環,從right指針開始,把指針所指向的元素和基準元素做比較。如果大于等于pivot,則指針向左移動;如果小于pivot,則right指針停止移動,切換到left指針。

    在當前數列中,1<4,所以right直接停止移動,換到left指針,進行下一步行動。

    輪到left指針行動,把指針所指向的元素和基準元素做比較。如果小于等于pivot,則指針向右移動;如果大于pivot,則left指針停止移動。

    由于left一開始指向的是基準元素,判斷肯定相等,所以left右移一位。

    由于7 > 4,left指針在元素7的位置停下。這時候,我們讓left和right指向的元素進行交換。

    接下來,我們進入第二次循環,重新切換到right向左移動。right先移動到8,8>2,繼續左移。由于2<8,停止在2的位置。

    切換到left,6>4,停止在6的位置。

    元素6和2交換。

    進入第三次循環,right移動到元素3停止,left移動到元素5停止。

    元素5和3交換。

    進入第四次循環,right移動到元素3停止,這時候請注意,left和right指針已經重合在了一起。

    當left和right指針重合之時,我們讓pivot元素和left與right重合點的元素進行交換。此時數列左邊的元素都小于4,數列右邊的元素都大于4,這一輪交換終告結束。

    代碼實現:

    總結

    以上是生活随笔為你收集整理的实现快速排序的算法_排序算法-快速排序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。