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

AI权益加!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

为加深对各种基础排序算法的理解,我基于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)




数据结构与算法 ---- 冒泡排序算法 冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。 假设待排序序列为 (5,1,4,2,8),如果采用冒泡排序对其进行升序(由小到大)排序,则整个排序过程如下所示: 第一轮排序,此时整个序列中的元素都位于待排序序列,依次扫描每对相邻的元素,并对顺序不正确的元素对交换位置,整个过程如图 1 所示。 从图 1 可以看到,经过第一轮冒泡排序,从. 阅读详情

相关推荐

Python实现快速排序冒泡排序,代+详细解析

2.分割重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成。快速排序使用分治法(Divideandconquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。冒泡排序每一次相邻的两个数做比较,大的往后移动一位,每次循环都会把最大的值(升序)或最小的值(降序)放在末端。3.递归排序子序列递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。......

cylcylccyyll的博客 1万+

python选择排序法详解_选择排序算法,C语言选择排序算法详解

选择排序算法,C语言选择排序算法详解选择排序是一种简单直观的排序算法。它与冒泡排序很相似,都是比较 n-1 轮,每轮都是比较 n–1–i 次,每轮找出一个最大值或最小值。只不过,冒泡排序是将每轮找出的最值放到最右边,而选择排序是将每轮找出的最值放到最左边。并且在算法上,冒泡排序是将相邻的数进行逐个比较,以从小到大排序为例,只要前面的比后面的大,就互换这两个数,直到最后将最大的数“浮”到最右边,如此...

weixin_39955825的博客 593

插入排序算法导论中的伪代码实现

JAVA 及 Python插入排序算法导论中的伪代码实现

qq_52659550的博客 3567

python实现选择排序

基本思想:假设排序表为L[1…n],第i趟排序即从L[i…n]中选择关键字最小的的元素与L[i]交换,每一趟排序可以确定一个元素的最终位置,则经过n-1趟排序可以使得整个排序表有序。空间效率:仅使用常数个辅助单元,因此空间效率为O(1)时间效率:O()它是一个不稳定的排序算法。堆排序是一种树形选择排序方法,在排序过程中,将L[1…n]看作一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的元素。

liulanba的博客 3万+

排序算法总结(Python版)

经典排序算法总结与实现 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序插入排序选择排序,希尔排序归并排序快速排序,堆排序。希望能帮助到有需要的同学。

Dby_freedom的博客 2万+

算法系列 | 2】深入解析排序算法之——插入排序

排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。以下是一些常见的排序算法冒泡排序(Bubble Sort)插入排序(Insertion Sort)选择排序(Selection Sort)归并排序(Merge Sort)快速排序(Quick Sort)堆排序(Heap Sort)插入排序原理介绍插入排序是一种简单直观的排序算法,其原理是将一个数组分成已排序和未排序两部分。

颜淡慕潇 1万+

排序算法介绍讲解(冒泡排序插入排序选择排序归并排序快速排序,堆排序)及其Python实现

排序 基于比较的排序算法的执行过程,会涉及两种操作,一种是元素比较大小,另一种是元素交换或移动。所以,如果我们在分析排序算法的执行效率的时候,应该把比较次数和交换(或移动)次数也考虑进去。 1 冒泡排序 冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。 Python实现如下: def bubble(arr): # 遍历所有的元素 for i in range(len(arr)): # 比对还未排

qq_35549634的博客 621

【菜鸟笔记|算法导论】十大排序算法总结与python实现

算法导论中提到了七种排序算法,再加上冒泡排序选择排序、希尔排序,构成我们常说的十大排序算法。其中冒泡、选择、插入、希尔、归并、堆、快速排序都是比较排序算法(即通过对元素进行大小比较来确定顺序);计数、基数、桶排序都是非比较排序算法。十大排序算法的性能比较如下表: 下面将简单描述十大排序算法的原理,并分别用python实现。笔记自用就不附原理图了,如果对原理有疑问请参阅算法导论那本书,里面算法运行过程图解是非常清楚的。 1.冒泡排序 比较相邻两个数,若前面的数比后面的数大,则交换位置。每一轮最大的数沉底,

weixin_45199399的博客 719

Python实现八大排序算法

八大排序算法Python实现: 一、 插入排序 描述: 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)...

qq_37857921的博客 2484

图文详解—十大经典排序算法

十大经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中 需要访问外存。常见的内部排序算法有:插入排序、希尔排序选择排序冒泡排序归并排序快速排序、堆排序、基数排序等。 排序算法 平均时间复杂度 最好情况 最坏情况 空间复杂度 排序方法 稳定性 冒泡排序 Θ(n2)\The...

weixin_45666566的博客 4309

python归并排序函数详解_python 实现归并排序算法

python数据结构与算法总结python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章:《数据结构和算法python意味着什么?》《顺序表数据结构在python中的应用》《python实现单向链表数据结构及其基本方法》《python实现单向循环链表数据结构及其方法》《python实现双向...文章python之战2019-04-241168浏览量算法基础:五大排序算法...

weixin_39568926的博客 1031

六种排序算法说明(适合408,懂点python的选手)

本文涉及408六种排序算法Python实现,包括冒泡排序选择排序插入排序快速排序归并排序、堆排序,以及这六种算法的核心思想、时间复杂度和稳定性。

weixin_69312848的博客 1092

python选择排序算法_经典排序算法总结与实现python版)

经典排序算法总结与实现经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序插入排序选择排序,希尔排序归并排序快速排序,堆排序。希望能帮助到有需要的同学。之所以用Python实现,主要是因为它更接近伪代码,能用更少的代实现算法,更利于理解。本篇博客所有排序实现均默认从小到大。一、冒泡排序BubbleSort介绍:冒泡排...

weixin_39621379的博客 250

数据结构十大经典排序算法--Python

十大经典排序算法 (java实现看这个)https://program.blog.csdn.net/article/details/83785159 名词解释: 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.归并排序 6.快速排序 7.堆排序 8.计数排序 9.桶排序 10.基数排序 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 834

排序python_算法_python各种排序的代实现

python各种排序的代实现冒泡排序# 冒泡排序def bubbleSort(alist):for passnum in range(len(alist)-1, 0, -1):for i in range(passnum):if alist[i] > alist[i + 1]:temp = alist[i]alist[i] = alist[i + 1]alist[i + 1] = temp...

weixin_39860166的博客 340

排序中减治法算法伪代码_十大排序算法,人人皆可掌握 ??

另类详解十大经典排序算法,力求代精简易读需要添加的内容很多,持续更新中!!!谈谈我是如何学习并掌握这些的只要你掌握了冒泡排序,前三个排序算法是直接看动画就能写出来,这里推荐下「算法动画图解」这款 App,可以一步一步地看算法具体执行过程,并配有文字讲解。「算法动画图解」冒泡排序执行过程剩下的排序算法看付费学习视频理解并掌握,其中也有些自己的思考,总结并与各位分享,代关键之处也会有详细的...

weixin_39987120的博客 227

七种经典的排序算法

原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序插入排序选择排序,希尔排序归并排序快速排序,堆排序。希望能帮助到有需要的同学。之所以用Python实现,主要是因为它更接近伪代码,能用更少的代...

Jasminexjf的博客 297

简单选择排序算法python_面试必备 | 排序算法Python实现

作者 | LeeLom常见的八大排序算法,他们之间关系如下:他们的性能比较:下面,利用Python分别将他们进行实现插入排序直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成:第一层循环:遍历待比较的所有数组元素第二层循环:将本轮选择的元素(s...

weixin_39617405的博客 99

python算法十大经典排序算法

基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。利用这一信息,就可以直接把x 放在它在输出数组上的位置上了,运行时间为O(n),但其需要的空间不一定,空间浪费大。

jindaima的博客 190
上一篇: 调试程序心得-2(提高程序执行效率)
下一篇: Python将数组(矩阵)存成csv文件,将csv文件读取为数组(矩阵)
Yunhe_Feng
博客等级 码龄17年 270粉丝 149原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值