计数排序之python
生活随笔
收集整理的這篇文章主要介紹了
计数排序之python
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
計數排序( Count sort)
一個不需要比較的,類似于桶排序的線性時間排序算法。該算法是對已知數量范圍的數組進行排序。其時間復雜度為O(n),適用于小范圍集合或重復元素多的排序。計數排序是用來排序0到100之間的數字的最?
好的算法。
1.算法描述:
“抽屜原理”
- 找出待排序的數組中最大和最小的元素;
- 統計數組中每個值為i的元素出現的次數,存入數組C的第i項;
- 對所有的計數累加(從C中的第一個元素開始,每一項和前一項相加);
- 反向填充目標數組:將每個元素i放在新數組的第C(i)項,每放一個元素就將C(i)減去1。
2.算法屬性:
- 穩定性:不穩定
- 時間復雜度:O(n)
- 空間復雜度:O(M)
3.代碼實現
#時間復雜度O(n) #kumata 's code ''' 三個步驟: 1.找出最大最小值 2.根據最大最小值差制造抽屜,把元素放進“抽屜” 3.把“抽屜”里面的元素拿出來重新排列 ''' import time def count_sort(nums):start = time.time() mmax, mmin = nums[0], nums[0]#第一個for循環找到最大值和最小值for i in range(1, len(nums)):if (nums[i] > mmax): mmax = nums[i]elif (nums[i] < mmin): mmin = nums[i]print('最大值:',mmax)print('最小值:',mmin)#“發抽屜”,制造多少個抽屜drawer = mmax - mmin + 1#剛開始抽屜里全部都是0counts = [0] * drawerprint('抽屜數:',counts) #通過index把元素往抽屜里面放for i in range (len(nums)):counts[nums[i] - mmin] = counts[nums[i] - mmin] + 1#把抽屜里面的元素拿出來重新排列#第一個for循環為抽屜的大小,第二個為抽屜里每個元素的個數,所以時間復雜度實為O(n)pos = 0for i in range(drawer): for j in range(counts[i]):nums[pos] = i + mminpos += 1t = time.time() - startreturn nums, t#輸出結果 最大值: 45 最小值: 1 抽屜數: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ([1, 2, 3, 4, 5, 6, 8, 11, 22, 45], 0.0005011558532714844)
?
轉載于:https://www.cnblogs.com/kumata/p/9122997.html
總結
以上是生活随笔為你收集整理的计数排序之python的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洋溢着美好意趣的意思是什么成语?
- 下一篇: Confluence 6 MySQL 输