Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)

本文详细介绍了冒泡排序、选择排序、插入排序、快速排序、归并排序和二分查找算法的实现过程,并通过Python代码进行了实例演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为加深对各种基础排序算法的理解,我基于Thomas H. Cormen等《算法导论》中的伪代码,用Python实现了冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法。


具体算法如下:


冒泡排序:


def bubbleSort(alist):
	for passnum in range(0, len(alist) - 1, 1):
		for i in range(0, len(alist) - passnum - 1, 1):
			if (alist[i] > alist[i+1]):
				tmp = alist[i+1]
				alist[i+1] = alist[i]
				alist[i] = tmp
				
alist = [54,26,93,17,77,31,44,55,20]
bubbleSort(alist)
print(alist)




选择排序


def selectionSort(alist):
	for i in range(0, len(alist), 1):
		min = alist[i]
		index = i
		for j in range(i, len(alist), 1):
			if ( alist[j] < min):
				min = alist[j]
				index = j
		tmp = alist[i]
		alist[i] = min
		alist[index] = tmp

				
alist = [54,26,93,17,77,31,44,55,20]
selectionSort(alist)
print(alist)


插入排序


def insertionSort(alist):
	for i in range(1, len(alist), 1):
		j = i - 1
		key = alist[i]
		while (j >= 0 and alist[j] > key):
			alist[j+1] = alist[j]
			j = j - 1
		alist[j + 1] = key 
				
alist = [54,26,93,17,77,31,44,55,20]
insertionSort(alist)
print(alist)


快速排序



	
from math import floor 
	
def partitions(alist, p, r):
	
	print ('start: ' + str(p))
	print ('end: ' + str(r))
	
	i = p - 1
	pivot = alist[r]
	for j in range(p, r, 1):
		if (alist[j] < pivot):
			i = i + 1
			tmp = alist[j]
			alist[j] = alist[i]
			alist[i] = tmp
	tmp = alist[r]
	alist[r] = alist[i + 1]
	alist[i + 1] = tmp
	print ('q: ' + str(i + 1))
	return i + 1
	
	
def quickSort(alist, p, r):
	if (p < r):
		q = partitions(alist, p, r)
		quickSort(alist, p, q - 1)
		quickSort(alist, q + 1, r)
		
alist = [54,26,93,17,77,31,44,55,20]
quickSort(alist, 0, 8)
print(alist)

# notice the range(0, 10, 1) is {0,1,2,3,4,5,6,7,8,9} not include 10 


归并排序



	
from math import floor 
	
def merge(alist, p, q, r):
	
	print ('start: ' + str(p))
	print ('q: ' + str(q))
	print ('end: ' + str(r))
	
	n1 = q - p + 1
	n2 = r - q
	left = [0]*(n1 + 1)
	right = [0]*(n2 + 1)
	for i in range(0, n1, 1):
		left[i] = alist[p + i]
	for j in range(0, n2, 1):
		right[j] = alist[q + j + 1]
	left[n1] = 100000
	right[n2] = 100000
	i = 0
	j = 0
	for k in range(p, r + 1, 1):
		if (left[i] <= right[j]):
			alist[k] = left[i]
			i = i + 1
		else:
			alist[k] = right[j]
			j = j + 1
	
def mergeSort(alist, p, r):
	if (p < r):
		q = floor((p + r)/2)
		mergeSort(alist, p, q)
		mergeSort(alist, q + 1, r)
		merge(alist, p, q, r)
		
alist = [54,26,93,17,77,31,44,55,20]
mergeSort(alist, 0, 8)
print(alist)

# notice the range(0, 10, 1) is {0,1,2,3,4,5,6,7,8,9} not include 10 



二分查找

from math import floor

def binarySearch(alist, n, low, high):
	if (low < high):
		mid = floor((high + low)/2)
		if (alist[mid] > n):
			binarySearch(alist, n, low, mid)
		else:
			binarySearch(alist, n, mid + 1, high)
		if (alist[mid] == n):
			print (mid)
			return mid
				
alist = [1,2,3,4,5,6,7,8]
binarySearch(alist, 6, 0, 7)




### 冒泡排序Python实现 以下是基于已有引用内容整理并完善的冒泡排序示例代: ```python def bubble_sort(arr): n = len(arr) # 获取数组长度 for i in range(n): # 控制外层循环,决定遍历次数 swapped = False # 设置标志位,判断是否发生过交换 for j in range(0, n - i - 1): # 内层循环负责比较相邻元素 if arr[j] > arr[j + 1]: # 如果前一个元素大于后一个元素 arr[j], arr[j + 1] = arr[j + 1], arr[j] # 进行交换 swapped = True # 更新标志位为True if not swapped: # 若未发生任何交换,提前结束排序 break return arr # 返回排序后的数组 # 测试代 if __name__ == "__main__": arr = [64, 34, 25, 12, 22, 11, 90] # 原始数组 print("原始数组:", arr) sorted_arr = bubble_sort(arr) # 调用函数进行排序 print("排序后的数组:", sorted_arr) ``` #### 关于时间复杂度和空间复杂度 - **最坏情况的时间复杂度**:当输入数组完全逆序时,需进行最多的比较和交换操作,其时间为 \(O(n^2)\)[^4]。 - **最好情况的时间复杂度**:如果输入数组已经是有序状态,则只需一次遍历即可完成排序,此时复杂度为 \(O(n)\)[^4]。 - **平均时间复杂度**:通常情况下,冒泡排序的时间复杂度为 \(O(n^2)\)[^4]。 - **空间复杂度**:由于该算法只使用了一个额外变量 `swapped` 来记录是否有交换发生,因此它的空间复杂度为 \(O(1)\),属于原地排序算法。 #### 工作原理概述 冒泡排序的核心思想在于反复遍历待排序序列中的每一对相邻元素,并按照指定规则调整它们之间的相对位置。具体而言,在每一次完整的遍历过程中,当前轮次的最大值会被逐步移至最终目标索引处;与此同时引入布尔型变量 `swapped` 对整个流程加以优化——一旦某一轮内没有任何数据被重新排列,则可断定整体已达到理想秩序从而立即终止后续迭代动作[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值