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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

圈排序——python

發布時間:2023/12/14 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 圈排序——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

from __future__ import print_functiondef cycle_sort(array):"""圈排序(不穩定排序)默認升序計數排序是另開辟空間存放排序結果,圈排序是不開辟空間,直接進行組內交換"""ans = 0 #記錄發生交換的次數,不用在意,無關緊要,可刪#外層循環處理列表中的每一個圈,一次遍歷出現一個圈for cycleStart in range(0, len(array) - 1):item = array[cycleStart] #取出待排序的元素,item一直記錄一圈的元素# 找到item應該放的位置,跟計數排序相似,統計列表中有多少個元素比item小pos = cycleStart #記錄位置for i in range(cycleStart + 1, len(array)):if array[i] < item:pos += 1# item也存在圈但這個圈只有它自己,表示item已經歸位,不用改變if pos == cycleStart:continue #跳過本次循環繼續下次循環# 這四行代碼是處理列表中相同的元素while item == array[pos]:#如果相同,就直接放在pos的后一個位置pos += 1array[pos], item = item, array[pos]#item最終歸位,并把item賦新值ans += 1#處理新的itemwhile pos != cycleStart:#pos=cycleStart就代表又回到了起點,表示已有元素歸到#cycleStart位置上,一圈處理完畢# 以下代碼跟上面思路一樣pos = cycleStartfor i in range(cycleStart + 1, len(array)):if array[i] < item:pos += 1while item == array[pos]:pos += 1array[pos], item = item, array[pos]ans += 1return ansif __name__ == '__main__':try:raw_input # Python 2except NameError:raw_input = input # Python 3user_input = raw_input('輸入待排序的數,用\",\"分隔:\n').strip()#strip() 方法用于移除字符串頭尾指定的字符(默認為空格)unsorted = [int(item) for item in user_input.split(',')]n = len(unsorted)cycle_sort(unsorted)print("排序后 : ")for i in range(0, n):print(unsorted[i], end=' ')

一些說明:

  • 我的github項目上有完整的算法代碼,歡迎star,fork.
  • 這里的所有算法均用python實現,“翻譯”自國外某程序員的項目。

總結

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

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