1. 程式人生 > 程式設計 >Python實現七個基本演算法的例項程式碼

Python實現七個基本演算法的例項程式碼

1.順序查詢

當資料儲存在諸如列表的集合中時,我們說這些資料具有線性或順序關係。 每個資料元素都儲存在相對於其他資料元素的位置。 由於這些索引值是有序的,我們可以按順序訪問它們。 這個過程產實現的搜尋即為順序查詢。

順序查詢原理剖析:從列表中的第一個元素開始,我們按照基本的順序排序,簡單地從一個元素移動到另一個元素,直到找到我們正在尋找的元素或遍歷完整個列表。如果我們遍歷完整個列表,則說明正在搜尋的元素不存在。

程式碼實現:該函式需要一個列表和我們正在尋找的元素作為引數,並返回一個是否存在的布林值。found 布林變數初始化為 False,如果我們發現列表中的元素,則賦值為 True。

def search(alist,item):
 find = False
 cur = 0
 while cur < len(alist):
 if alist[cur] == item:
  find = True
  break
 else:
  cur += 1
 return find

2.二分查詢

有序列表對於我們的實現搜尋是很有用的。在順序查詢中,當我們與第一個元素進行比較時,如果第一個元素不是我們要查詢的,則最多還有 n-1 個元素需要進行比較。

二分查詢則是從中間元素開始,而不是按順序查詢列表。 如果該元素是我們正在尋找的元素,我們就完成了查詢。 如果它不是,我們可以使用列表的有序性質來消除剩餘元素的一半。

如果我們正在查詢的元素大於中間元素,就可以消除中間元素以及比中間元素小的一半元素。如果該元素在列表中,肯定在大的那半部分。然後我們可以用大的半部分重複該過程,繼續從中間元素開始,將其與我們正在尋找的內容進行比較。

def search(alist,item):
 left = 0
 right = len(alist) - 1
 find = False

 while left <= right:
 mid_index = (left + right)//2
 if item == alist[mid_index]:
  find = True
  break
 else:
  if item > alist[mid_index]:
  left = mid_index + 1
  else:
  right = mid_index -1

 return find

3.氣泡排序

原理:

比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後一個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。


Python實現七個基本演算法的例項程式碼

def sort(alist):
 length = len(alist)
 for i in range(0,length-1):
  for j in range(0,length-1-i):
  if alist[i] > alist[i+1]:
   alist[i],alist[i+1] = alist[i+1],alist[i]

4.選擇排序

工作原理:第一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,然後再從剩餘的未排序元素中尋找到最小(大)元素,然後放到已排序的序列的末尾。以此類推,直到全部待排序的資料元素的個數為零。選擇排序是不穩定的排序方法。

Python實現七個基本演算法的例項程式碼

def sort(alist):
 length = len(alist)
 for j in range(length-1,-1):
 max_index = 0
 for i in range(1,j+1):
  if alist[max_index] < alist[i]:
  max_index = i
 alist[max_index],alist[j] = alist[j],alist[max_index]

5.插入排序

原理:

基本思想是,每步將一個待排序的記錄,按其關鍵碼值的大小插入前面已經排序的檔案中適當位置上,直到全部插入完為止。關鍵碼是資料元素中某個資料項的值,用它可以標示一個數據元素。

Python實現七個基本演算法的例項程式碼

def sort(alist):
 length = len(alist)
 for j in range(1,length):
 i = j
 while i > 0:
  if alist[i] < alist[i-1]:
  alist[i],alist[i-1] = alist[i-1],alist[i]
  i -= 1
  else:
  break

希爾排序(Shell's Sort)是插入排序的一種又稱“縮小增量排序”(Diminishing Increment Sort),是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。

該方法的基本思想是:先將整個待排元素序列分割成若干個子序列(由相隔某個“增量(gap)”的元素組成的)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。因為直接插入排序在元素基本有序的情況下(接近最好情況),效率是很高的,因此希爾排序在時間效率比直接插入排序有較大提高。

def sort(alist):
 gap = len(alist)//2
 while gap >= 1:
 for j in range(gap,len(alist)):
  i = j
  while i > 0:
  if alist[i] < alist[i-gap]:
   alist[i],alist[i-gap] = alist[i-gap],alist[i]
   i -= gap
  else:
   break
 gap = gap // 2

6.快速排序

基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

Python實現七個基本演算法的例項程式碼

def sort(alist,start,end):
 low = start
 high = end
 if low >= high:
 return
 mid = alist[low]
 while low < high:
 while low < high:
  if alist[high] >= mid:
  high -= 1
  else:
  alist[low] = alist[high]
  break
 while low < high:
  if alist[low] < mid:
  low += 1
  else:
  alist[high] = alist[low]
  break
 alist[low] = mid
 sort(alist,low-1)
 sort(alist,high+1,end)

7.歸併排序

歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。

Python實現七個基本演算法的例項程式碼

def merge_sort(alist):
 n = len(alist)
 #結束遞迴的條件
 if n <= 1:
 return alist
 #中間索引
 mid = n//2

 left_li = merge_sort(alist[:mid])
 right_li = merge_sort(alist[mid:])

 #指向左右表中第一個元素的指標
 left_pointer,right_pointer = 0,0
 #合併資料對應的列表:該表中儲存的為排序後的資料
 result = []
 while left_pointer < len(left_li) and right_pointer < len(right_li):
 #比較最小集合中的元素,將最小元素新增到result列表中
 if left_li[left_pointer] < right_li[right_pointer]:
  result.append(left_li[left_pointer])
  left_pointer += 1
 else:
  result.append(right_li[right_pointer])
  right_pointer += 1
 #當左右表的某一個表的指標偏移到末尾的時候,比較大小結束,將另一張表中的資料(有序)新增到result中
 result += left_li[left_pointer:]
 result += right_li[right_pointer:]

 return result

alist = [3,8,5,7,6]
print(merge_sort(alist))

8.各個演算法的時間複雜度

Python實現七個基本演算法的例項程式碼

到此這篇關於Python實現七個基本演算法的例項程式碼的文章就介紹到這了,更多相關Python基本演算法內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!