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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

快速排序(三级)

發布時間:2024/4/13 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 快速排序(三级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面我們來看快速排序,快速排序有什么要說的,首先要知道快速排序是冒泡排序的改進版,他們都屬于交換排序,他被認為是現在最好的一種排序,他這里還涉及到兩個概念,一個是分治,分而治之,把一個大的數列分成兩個小的數列,小的分成兩個小的,是可以這么來分的,主要是分治和遞歸冒泡排序他有什么缺點,他會不停的比較,它會頻繁的進行比較,但關鍵字每次進行比較完,滿足條件它會有更頻繁的移動,交換,他不僅有頻繁的比較,而且他有頻繁的交換,所以他的性能是比較低的那我們來看一下快速排序是怎么回事啊,1962年推出的算法,不同的語言給出他的實現,基本思想有三步:1. 第一步,先從數列中取出一個數作為基準數,別的數比他大比他小,它是個基準,簡單起見,你只要去數列的第一個數就可以了,比如說我們下面有一個數列,從0到9一共有10個數,那大家來看,我要取一個數為基準數,72做基準數吧,看下面這些數是比他大還是比他小的,這是一個2. 分區過程,干什么,我們要做一系列的操作,這是他最核心的部分,經過這個分區操作之后呢,這個數列里面,72在這兒,前面都是比他小的,后面都是比他大的,這個過程叫分區,初始狀態在這兒呢,一共有10個數,那我們第一步已經做了,拿著第一個數72為基準數,我們把72賦給一個變量x,相當于在這里挖了一個坑,這個72實際上還是在,因為當你把72賦給另外一個變量的話,這個 值是不是還在呢,值在不要緊,我們就當無視他就可以了,這是一個,我們下面就要做操作了,經過這么一系列的操作,最后能夠達到這樣的一個效果,哪個效果啊,就是這個效果,你看這個效果是什么,72左邊的全部都是小于他的,右邊全部是大于72的,排序到此就結束了嗎,早著呢,為什么呢,左邊這些還是無序的,右邊這些還是無序的,下邊怎么辦,兩個字,遞歸,這就是我們的第三步3. 再對左右區間重復第一步,第二步,直到各區間只剩下一個數,這就是在遞歸,把左邊這部分看作是一個完整的數組,首先挖個坑,把這個48拿出來,經過一系列的操作,保證48前面的都是小于48的,后邊都是大于48的,綠色這一部分呢,也可以挖坑,先把83拿出來,挖個坑,通過一系列的變換之后,保證這4個數,83前邊小于83,后面大于83,一直往下進行,直到這個數組只剩下一個數,一個數就不用理了,是不是他啊,這樣就可以了,這就是我們所說的一個主要的思路 從一個數列里面取一個數作為基準數,拿出來就可以了,然后再對前兩步進行重復,遞歸是非常簡單的,所以最難的地方在分區,就是我們從這個一步,到最終這一步,這中間到底發生了什么,這就是快速排序的核心,因為再往下,左邊右邊再重復,是不是也就重復剛才的算法,是重復這個算法,我們來看它是怎么來動的1. 初始狀態,一共有10個數,我們為了說明白,用下標直接標記0到9,從72開始,這個數是沒有任何順序的,我們從第一步開始,我們要指定兩個指針,一個叫i,i等于0,i指向這個數組的首元素,j指向數組的最后的一個位置,i數組等于0,j都等于9,然后我們把這個坑給挖出來,怎么挖出來,把這個72賦給另外一個變量,72讓他先在一邊先歇一會,下邊我們要干什么,這邊挖了一個坑,目的是為了填坑,這個數據是不是空出來了,那你覺得這里要放一個大于72的還是小于72的,小于72的吧,我們從哪里找小于72的數啊,從右邊去找吧,所以下面我們要動j的指針,這個指針要從右向左來動,動什么啊,第一個是85,和72比,再動下一個,48,找到這個48了吧,48是不是要放到前面去,從右向左移動這個j,找到第一個小于72的值,j等于8,怎么來表示這個48呢,他的索引不就是j嘛,拿到48,把這個坑填了他,填了之后i就可以往前動一下了,i到這兒就可以了,這么一做,填了一個坑,又造了一個坑,是不是又造了一個坑,你覺得下一步是干什么了,下一個步這個坑又要放一個數,那應該放一個什么樣的數啊,大于72的數,從哪兒去找一個大于72的數,從左邊去找,我們要把左邊大于72的數移到右邊,把右邊小于72的數全部移到左邊,這72不就是在中間了嗎,這j等于8是個坑了,下面我們怎么辦,我們現在移動i這個指針了,移動這個i了,6怎么辦啊,都和72比,不動,57不動,88,從左向右移動i,找到第一個大于等于72的值,在這兒呢,88到這兒了,i等于3,下一步就要填坑了,我要把88填到這兒,你告訴我這個語句該怎么實現,我怎么就能把88填到這兒呢,88的索引不是3嗎,這坑的索引不是8嗎,所以是特別好填的,如果數組是arr的話,實際上是把誰給誰,arr[j]=arr[i],前邊填后邊的坑,arr[i]給后面的arr[j],這是一個啊,88這個坑填了,告訴我把這個坑填了干什么,指針j要往前動一下,兩個指針是不是都要往中間動啊,88把這個坑填了,j動一下,前邊又造了一個坑,前面造一個坑干什么,必須動這個j往前動,有人說能往后動嗎,后邊全部是大于72的,不用動的,再動這個j,73大于72,83大于72,當j等于5的時候,72大于42,拿著42把這個坑填了,是不是又造了一個坑,同時i要往前移動一個,可是我這里又多了一個坑,這個怎么辦了,這個該怎么辦了,現在不能放72了,憑什么又放72了,萬一放個85呢,是不是還得動這個i,拿著這個i,60,我們和62比,他是不是小于72的,那就要再動這個i,那就動動,i和j到一起了,是不是到一起了,左邊的都小于72,我們把一輪的分區操作就搞定了,我們再把這個簡單回憶一下,基本思路是什么,設兩個指針,一個指向首,一個指向尾,把第一個數據挖坑,挖出來,然后就開始動右邊的指針,找到小于的數填左邊的坑,然后就開始動左邊的指針,找出大的數填右邊的坑,填完坑再重復右邊的步驟,移動右邊的指針往里邊動,依次進行,知道i等于j,兩個指針都向中間的動,i++,j--,最終到i等于j的時候,這個位置就是72最終要放的位置,這就一個分區操作完成了,請問下面我們該怎么辦了,我們就要遞歸重復之前的操作了,如果我們對藍色的進行遞歸的操作的話,應該設一個i在左邊,設置一個j在這個小數組的右邊,48這個坑挖了,60就往左邊動,填了坑之后48往右邊動,什么時候i等于j的時候,48就放在中間的位置,綠色的部分找個基準的元素,83先拿出來,i指向誰,指向第一個,j指向誰,指向最后一個,i往右邊動,j往左邊動,是不是就可以了,最終i等于j的時候就是83該放的位置,一直遞歸下去,一直就等到只放一個數了,那就是他該放的位置,就是他了,做來做去,就重復剛才的兩個動作,最終會實現這么一個結果,完全有序的,這就是我們快速排序的算法,那就說到這兒呢,不再重復,已經說明白了快速排序,有冒泡,它是在冒泡基礎上實現的,有分治,分而治之,把一個數組分區,分兩塊,兩塊再分,再分別分遞歸快速排序我們可以用一句話來概括,叫東拆西補,西拆東補,一邊拆一邊補,一邊挖坑一邊填坑算法說道這兒,下面我們就用代碼來實現了 快速排序算法的分析:1. 我們直接記住結論就可以了,在最壞的情況下,他的時間復雜度是O(n2),冒泡排序就是一樣的2. 好的情況下是O(nlog2 n),已經不可能比這個更好了,這是最好的情況,最高效率3. 快速排序的空間復雜度為什么是O(log2 n),因為它用到了遞歸,遞歸的log2 n次4. 當待排元素中[6,1,3,7,3],是不是有兩個3,最終可能會生成[1,3,3,6,7]這個樣子,什么意思,前面跑到后面了,這種情況是會出現的,同樣說明我們這種快速排序是一種不穩定的排序,排序我就給大家說到這,后面還有排序更多的分析可以把它作為閱讀資料來看一下快速排序是冒泡排序的改進版,也是最好的一種內排序,還涉及到分治和遞歸,把這個記住

?

超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的快速排序(三级)的全部內容,希望文章能夠幫你解決所遇到的問題。

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