1. 程式人生 > 其它 >排序演算法總結(python實現)

排序演算法總結(python實現)

技術標籤:演算法

排序演算法總結

氣泡排序

氣泡排序可能是大家在大學計算機課程中接觸的第一個排序演算法,雖然其複雜度相對較高,但其中著眼於一點的問題解決方式是值得我們學習和借鑑的,當然我們可以先排最後一個位置的數,也可以先排最初始位置的數,其在程式設計上沒有本質的區別,下面展示最典型的兩種排法:

#先排最後的位置
def bub_sort(seq: list) -> list:
	for j in range(len(seq)-1,0,-1):
		for i in range(j):
			if seq[i] > seq[i+1]:
				seq[i],seq[i+1] =
seq[i+1], seq[i] return seq #先排初始的位置 def bub_sort(seq: list) -> list: for i in range(len(seq)): for j in range(len(seq)-1, i, -1): if seq[j] < seq[j-1]: seq[j], seq[j-1] = seq[j-1], seq[j] return seq

其遞迴的寫法也就是把最外面一層迴圈換成遞迴的形式

插入排序

這個排序方式也是比較簡單的,當然對於插入,我們也有二分插入,遍歷插入等不同的方式

迴圈版本
def ins_sort(seq: list) -> list:
	for i in range(1,len(seq)):
		j = i
		while j > 0 and seq[j-1] > seq[j]:
			seq[j-1], seq[j] = seq[j], seq[j-1]
			j -= 1
	return seq
遞迴版本
def ins_sort(seq: list, i: int) -> list:
	if i == 0:
		return
	ins_sort(seq,i-1)
	j = i
	while j > 0 and seq[
j-1] > seq[j]: seq[j-1], seq[j] = seq[j], seq[j-1] j -= 1 return seq
最大值查詢

查詢的方法,當然還有最大值查詢,方法很簡單,我們只需要查詢最大值然後交換就可以了

#迴圈版
def ins_sort(seq: list) -> list:
	for i in range(len(seq)-1,0,-1):
		max_val = i
		for j in range(i):
			if seq[max_val] < seq[j]:
				max_val = j
		seq[i], seq[max_val] = seq[max_val], seq[i]
	return seq

#遞迴版
def ins_sort(seq: list, num: int) -> list:
  if num == 0:
    return
  max_val = num
  for j in range(max_val):
    if seq[max_val] < seq[j]:
      max_val = j
  seq[num], seq[max_val] = seq[max_val], seq[num]
  ins_sort_1(seq, num-1)
  return seq
二分插入

我們現在是對插入方式進行優化,但二分插入還有許多其他的用處,比如說,我們通過二分插入去找一個有序序列插入時的索引等

def div(seq: list, end_num: int, num) -> list:
  sta_num = 0
  while sta_num <= end_num:
    mid = (sta_num + end_num) // 2
    if seq[mid] <= num:
      sta_num = mid + 1
    else:
      end_num = mid - 1
  seq.insert(sta_num, num)
def ins_sort(seq: list) -> list:
	for i in range(1,len(seq)):
		seq.pop(i)
		div(seq, i-1, i)
	return seq

這樣進行排序的時候,結果沒有什麼大問題,但其實我們還可以再優化一下,因為進行一次pop和insert列表的儲存位置都會發生變化,並且,這種變化是不必要的,其實我們可以用連結串列的資料結構進行優化,但連結串列的缺點也很明顯,就是無法方便的訪問資料。