自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

八大排序算法的Python實(shí)現(xiàn)

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

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

1、插入排序

描述

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

代碼實(shí)現(xiàn)

  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)是插入排序的一種。也稱縮小增量排序,是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。該方法因DL.Shell于 1959年提出而得名。 希爾排序是把記錄按下標(biāo)的一定增量分組,對(duì)每組使用直接插入排序算法排序;隨著增量逐漸減少,每組包含的關(guān)鍵詞越來越多,當(dāng)增量減至1時(shí),整個(gè)文件恰被分 成一組,算法便終止。

代碼實(shí)現(xiàn)

  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、冒泡排序

描述

它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序錯(cuò)誤就把他們交換過來。走訪數(shù)列的工作是重復(fù)地進(jìn)行直到?jīng)]有再需要交換,也就是說該數(shù)列已經(jīng)排序完成。

代碼實(shí)現(xiàn)

  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、快速排序

描述

通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小,然后再按此方法對(duì)這兩部分?jǐn)?shù)據(jù)分別進(jìn)行快速排序,整個(gè)排序過程可以遞歸進(jìn)行,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列。

代碼實(shí)現(xiàn)

  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]交換,使有序序列不斷增長(zhǎng)直到全部排序完畢。

代碼實(shí)現(xiàn)

  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)是指利用堆積樹(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種??梢岳脭?shù)組的特點(diǎn)快速定位指定索引的元 素。堆分為大根堆和小根堆,是完全二叉樹。大根堆的要求是每個(gè)節(jié)點(diǎn)的值都不大于其父節(jié)點(diǎn)的值,即A[PARENT[i]] >= A[i]。在數(shù)組的非降序排序中,需要使用的就是大根堆,因?yàn)楦鶕?jù)大根堆的要求可知,***的值一定在堆頂。

代碼實(shí)現(xiàn)

  1. # 調(diào)整堆 
  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. # 創(chuàng)建堆 
  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)的一個(gè)非常典型的應(yīng)用。將已有序的子序列合并,得到完全有序的序列;即先使每個(gè)子序列有序,再使子序列段間有序。若將兩個(gè)有序表合并成一 個(gè)有序表,稱為二路歸并。

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

代碼實(shí)現(xiàn)

 

  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、基數(shù)排序

描述

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

代碼實(shí)現(xiàn)

  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 

 

責(zé)任編輯:王雪燕 來源: 2liang.me
相關(guān)推薦

2018-10-10 14:03:00

Java開發(fā)代碼

2016-09-30 14:23:16

數(shù)據(jù)結(jié)構(gòu)算法八大排序算法

2020-09-14 14:47:13

排序算法

2015-11-12 11:05:07

java排序算法

2019-05-29 17:45:32

JavaScript算法思路代碼實(shí)現(xiàn)

2021-08-25 09:59:00

開發(fā)排序代碼

2020-08-16 11:37:27

Python開發(fā)工具

2009-06-22 14:07:46

JSF優(yōu)勢(shì)

2025-01-13 09:00:00

Python文件讀寫代碼

2022-04-25 13:11:14

Python編程技巧

2011-04-29 09:15:16

Servlet

2024-04-24 09:52:19

云技能云遷移云計(jì)算

2023-12-27 11:45:09

2025-01-02 12:51:06

2012-05-10 16:45:54

linux系統(tǒng)

2022-01-05 09:26:56

IT災(zāi)難IT故障

2011-08-17 13:55:25

VoIPPBX

2020-10-14 10:21:02

算法算法思想數(shù)據(jù)

2020-11-25 10:40:58

程序員技能開發(fā)者

2012-05-05 09:28:50

三星
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)