成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

八大排序算法的Python實現

開發 后端 算法
本文主要介紹了常見的8大排序算法基本概念以及其Python實現方式,如果你是Java程序員,也可以看看之前我們介紹的Java程序員必須掌握的8大排序算法。

本文主要介紹了常見的8大排序算法基本概念以及其Python實現方式,如果你是Java程序員,也可以看看之前我們介紹的Java程序員必須掌握的8大排序算法。

1、插入排序

描述

插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用于少量數據的排序,時間復雜度為 O(n^2)。是穩定的排序方法。插入算法把要排序的數組分成兩部分:***部分包含了這個數組的所有元素,但將***一個元素除外(讓數組多一個空間才有插 入的位置),而第二部分就只包含這一個元素(即待插入元素)。在***部分排序完成后,再將這個***元素插入到已排好序的***部分中。

代碼實現

  1. def insert_sort(lists): 
  2.     # 插入排序 
  3.     count = len(lists) 
  4.     for i in range(1, count): 
  5.         key = lists[i] 
  6.         j = i - 1 
  7.         while j >= 0
  8.             if lists[j] > key: 
  9.                 lists[j + 1] = lists[j] 
  10.                 lists[j] = key 
  11.             j -= 1 
  12.     return lists 

2、希爾排序

描述

希爾排序(Shell Sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進版本。希爾排序是非穩定排序算法。該方法因DL.Shell于 1959年提出而得名。 希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個文件恰被分 成一組,算法便終止。

代碼實現

  1. def shell_sort(lists): 
  2.     # 希爾排序 
  3.     count = len(lists) 
  4.     step = 2 
  5.     group = count / step 
  6.     while group > 0
  7.         for i in range(0, group): 
  8.             j = i + group 
  9.             while j < count: 
  10.                 k = j - group 
  11.                 key = lists[j] 
  12.                 while k >= 0
  13.                     if lists[k] > key: 
  14.                         lists[k + group] = lists[k] 
  15.                         lists[k] = key 
  16.                     k -= group 
  17.                 j += group 
  18.         group /= step 
  19.     return lists 

3、冒泡排序

描述

它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。

代碼實現

  1. def bubble_sort(lists): 
  2.     # 冒泡排序 
  3.     count = len(lists) 
  4.     for i in range(0, count): 
  5.         for j in range(i + 1, count): 
  6.             if lists[i] > lists[j]: 
  7.                 lists[i], lists[j] = lists[j], lists[i] 
  8.     return lists 

4、快速排序

描述

通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然后再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

代碼實現

  1. def quick_sort(lists, left, right): 
  2.     # 快速排序 
  3.     if left >= right: 
  4.         return lists 
  5.     key = lists[left] 
  6.     low = left 
  7.     high = right 
  8.     while left < right: 
  9.         while left < right and lists[right] >= key: 
  10.             right -= 1 
  11.         lists[left] = lists[right] 
  12.         while left < right and lists[left] <= key: 
  13.             left += 1 
  14.         lists[right] = lists[left] 
  15.     lists[right] = key 
  16.     quick_sort(lists, low, left - 1
  17.     quick_sort(lists, left + 1, high) 
  18.     return lists 

5、直接選擇排序

描述

基本思想:第1趟,在待排序記錄r1 ~ r[n]中選出最小的記錄,將它與r1交換;第2趟,在待排序記錄r2 ~ r[n]中選出最小的記錄,將它與r2交換;以此類推,第i趟在待排序記錄r[i] ~ r[n]中選出最小的記錄,將它與r[i]交換,使有序序列不斷增長直到全部排序完畢。

代碼實現

  1. def select_sort(lists): 
  2.     # 選擇排序 
  3.     count = len(lists) 
  4.     for i in range(0, count): 
  5.         min = i 
  6.         for j in range(i + 1, count): 
  7.             if lists[min] > lists[j]: 
  8.                 min = j 
  9.         lists[min], lists[i] = lists[i], lists[min] 
  10.     return lists 

6、堆排序

描述

堆排序(Heapsort)是指利用堆積樹(堆)這種數據結構所設計的一種排序算法,它是選擇排序的一種??梢岳脭到M的特點快速定位指定索引的元 素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個節點的值都不大于其父節點的值,即A[PARENT[i]] >= A[i]。在數組的非降序排序中,需要使用的就是大根堆,因為根據大根堆的要求可知,***的值一定在堆頂。

代碼實現

  1. # 調整堆 
  2. def adjust_heap(lists, i, size): 
  3.     lchild = 2 * i + 1 
  4.     rchild = 2 * i + 2 
  5.     max = i 
  6.     if i < size / 2
  7.         if lchild < size and lists[lchild] > lists[max]: 
  8.             max = lchild 
  9.         if rchild < size and lists[rchild] > lists[max]: 
  10.             max = rchild 
  11.         if max != i: 
  12.             lists[max], lists[i] = lists[i], lists[max] 
  13.             adjust_heap(lists, max, size) 
  14.  
  15. # 創建堆 
  16. def build_heap(lists, size): 
  17.     for i in range(0, (size/2))[::-1]: 
  18.         adjust_heap(lists, i, size) 
  19.  
  20. # 堆排序 
  21. def heap_sort(lists): 
  22.     size = len(lists) 
  23.     build_heap(lists, size) 
  24.     for i in range(0, size)[::-1]: 
  25.         lists[0], lists[i] = lists[i], lists[0
  26.         adjust_heap(lists, 0, i) 

7、歸并排序

描述

歸并排序是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合并,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合并成一 個有序表,稱為二路歸并。

歸并過程為:比較a[i]和a[j]的大小,若a[i]≤a[j],則將***個有序表中的元素a[i]復制到r[k]中,并令i和k分別加上1;否 則將第二個有序表中的元素a[j]復制到r[k]中,并令j和k分別加上1,如此循環下去,直到其中一個有序表取完,然后再將另一個有序表中剩余的元素復 制到r中從下標k到下標t的單元。歸并排序的算法我們通常用遞歸實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序, ***把左區間和右區間用一次歸并操作合并成有序的區間[s,t]。

代碼實現

 

  1. def merge(left, right): 
  2.     i, j = 00 
  3.     result = [] 
  4.     while i < len(left) and j < len(right): 
  5.         if left[i] <= right[j]: 
  6.             result.append(left[i]) 
  7.             i += 1 
  8.         else
  9.             result.append(right[j]) 
  10.             j += 1 
  11.     result += left[i:] 
  12.     result += right[j:] 
  13.     return result 
  14.  
  15. def merge_sort(lists): 
  16.     # 歸并排序 
  17.     if len(lists) <= 1
  18.         return lists 
  19.     num = len(lists) / 2 
  20.     left = merge_sort(lists[:num]) 
  21.     right = merge_sort(lists[num:]) 
  22.     return merge(left, right) 

8、基數排序

描述

基數排序(radix sort)屬于“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬于穩定性的排序,其時間復雜度為O (nlog(r)m),其中r為所采取的基數,而m為堆數,在某些時候,基數排序法的效率高于其它的穩定性排序法。

代碼實現

  1. import math 
  2. def radix_sort(lists, radix=10): 
  3.     k = int(math.ceil(math.log(max(lists), radix))) 
  4.     bucket = [[] for i in range(radix)] 
  5.     for i in range(1, k+1): 
  6.         for j in lists: 
  7.             bucket[j/(radix**(i-1)) % (radix**i)].append(j) 
  8.         del lists[:] 
  9.         for z in bucket: 
  10.             lists += z 
  11.             del z[:] 
  12.     return lists 

 

責任編輯:王雪燕 來源: 2liang.me
相關推薦

2018-10-10 14:03:00

Java開發代碼

2016-09-30 14:23:16

數據結構算法八大排序算法

2020-09-14 14:47:13

排序算法

2019-05-29 17:45:32

JavaScript算法思路代碼實現

2015-11-12 11:05:07

java排序算法

2009-06-22 14:07:46

JSF優勢

2021-08-25 09:59:00

開發排序代碼

2025-01-13 09:00:00

Python文件讀寫代碼

2025-01-02 12:51:06

2012-05-10 16:45:54

linux系統

2023-12-27 11:45:09

2022-04-25 13:11:14

Python編程技巧

2011-04-29 09:15:16

Servlet

2024-04-24 09:52:19

云技能云遷移云計算

2011-08-17 13:55:25

VoIPPBX

2020-08-16 11:37:27

Python開發工具

2022-01-05 09:26:56

IT災難IT故障

2011-04-14 18:03:49

2011-12-19 09:35:53

2022-05-07 11:13:58

蘋果汽車技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一a一片一级一片啪啪 | 精品一区在线免费观看 | 国产激情综合五月久久 | 日日操夜夜操天天操 | 中文字幕在线人 | 国产精品成人一区二区三区 | 91精品国产自产精品男人的天堂 | 黄色a视频 | 日韩欧美亚洲一区 | 欧美 日韩 中文 | 一区二区三区亚洲精品国 | 久久久久国产一区二区三区四区 | 日韩视频精品在线 | 视频一区二区三区中文字幕 | 伊人久久伊人 | 久久精品国产一区二区三区不卡 | 美女天天操 | 91精品综合久久久久久五月天 | 一本一道久久a久久精品综合蜜臀 | 亚洲精品亚洲人成人网 | 91精品国产自产在线老师啪 | 91久久国产综合久久91精品网站 | 国产91精品网站 | 国产黄色大片 | 一区二区三区在线免费观看 | 国产h视频| 国产成人av在线播放 | 国产日韩电影 | av一区在线 | 一级做受毛片免费大片 | 欧美女优在线观看 | 中文字幕视频在线 | 成人免费视频网址 | av黄色在线 | 在线成人av | 日韩精品av| 久久青青 | 免费的av网站 | 在线观看视频91 | 欧美精品在线免费观看 | 欧美一级久久 |