圈排序——python
所謂的圈的定義,我只能想到用例子來說明,實在不好描述
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
第一部分
第一步,我們現在來觀察待排數組和排完后的結果,以及待排數組的索引,可以發現
排完序后的6應該出現在索引4的位置上,而它現在卻在位置0上,
記住這個位置啊,一直找到某個數應該待在位置0上我們的任務就完成了
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
第二步,而待排數組索引4位置上的5應該出現在索引3的位置上
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
第三步,同樣的,待排數組索引3的位置是1,1應該出現在位置0上,注意注意,找到這么一個數了:1,它應該待在位置0上
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
第四步,而索引0處卻放著6,而6應該出現在索引4的位置,至此可以發現,回到原點了,問題回到第一步了,
所以這里并不存在所謂的第四步,前三步就已經轉完一圈了
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
這就是所謂的一圈!真不好描述,不知道您看明白沒…汗.
前三步轉完一圈,得到的數據分別是[ 6 5 1 ]
第二部分
第一步,圈排序并不是一圈排序,而一圈或多圈排序,所以,還得繼續找,這一步從第二個數字2處開始轉圈
待排中的2位于索引1處,排序完畢仍然處于位置1位置,所以這一圈完畢,得到圈數據[ 2 ]
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
第三部分
第一步,同上,4也出現了它應該待的位置,結束這一圈,得到第三個圈:[ 4 ]
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
第四部分
第一步,由于1和5出現在第一圈里,這是什么意思呢,說明這兩個數已經有自己的圈子了,不用再找了,
即是找,最后還是得到第一圈的數據[ 6 5 1 ],所以,1和5跳過,這一部分實際應該找的是9,來看看9的圈子
9應該出現在索引5的位置,實際上它就在索引5的位置,與第二部分的第一步的情況一樣,所以這一圈的數據也出來了:[ 9 ]
待排數組[ 6 2 4 1 5 9 ]
排完序后[ 1 2 4 5 6 9 ]
數組索引[ 0 1 2 3 4 5 ]
一共找到四個圈子,分別是
[ 6 5 1 ] , [ 2 ] ,[ 4 ] , [ 9 ]
如果一個圈只有一個數字,那么它是不需要轉圈的,即不需要排序,那么只有第一個圈排序即可
你可能要問了,前邊的那些圈子都是基于已知排序結果才能得到,我都已知結果還排個毛啊
以上內容都是為了說明什么是圈,知道什么是圈后才能很好的理解圈排序
現在來分解排序的細節
第一步,將6取出來,計算出有4個數字比6小,將6放入索引4,同時原索引4位置的數字5出列
排序之前[ 0 2 4 1 5 9 ] 6
排序之后[ 0 2 4 1 6 9 ] 5
索引位置[ 0 1 2 3 4 5 ]
第二步,當前數字5,計算出有3個數字比5小,將5放入索引3,同時原索引3位置的數字
排序之前[ 0 2 4 1 6 9 ] 5
排序之后[ 0 2 4 5 6 9 ] 1
索引位置[ 0 1 2 3 4 5 ]
第三步,當前數字1,計算出有0個數字比1小,將1放入索引0,索引0處為空,這圈完畢
排序之前[ 0 2 4 5 6 9 ] 1
排序之后[ 1 2 4 5 6 9 ]
索引位置[ 0 1 2 3 4 5 ]
第一個圈[ 6 5 1 ]完畢
第四步,取出下一個數字2,計算出有1個數字比2小,將2放入索引1處,發現它本來就在索引1處
第五步,取出下一個數字4,計算出有2個數字比4小,將4放入索引2處,發現它本來就在索引2處
第六步,取出下一個數字5,5在第一個圈內,不必排序
第七步,取出下一個數字6,6在第一個圈內,不必排序
第八步,取出下一個數字9,計算出有5個數字比9小,將9放入索引5處,發現它本來就在索引5處
全部排序完畢
以上算法講解來自kkun
一些說明:
- 我的github項目上有完整的算法代碼,歡迎star,fork.
- 這里的所有算法均用python實現,“翻譯”自國外某程序員的項目。
總結
以上是生活随笔為你收集整理的圈排序——python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员如何留住健康?
- 下一篇: Markov Chains