排序算法(python)

排序算法

冒泡排序

一次比较相邻的两个数,每轮之后末尾的数字是确定的。

  • 时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( 1 ) O(1) O(1),稳定。
python 复制代码
def BUB(nums):
	for i in range(len(nums)):
		count = 0
		for j in range(len(nums)-i-1):
			if nums[j] > nums[j+1]:
				nums[j], nums[j+1] = nums[j+1], nums[j]
				count += 1
		# count是为了记录该轮是否有修改的,若没有修改,则说明当前数组已经满足条件,不需要再进行交换了。
		if count == 0:
			break
	return nums

选择排序

选择排序是每轮在剩余的元素中,找到最小的元素交换位置。

  • 时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( 1 ) O(1) O(1),不稳定。
python 复制代码
def selection(nums):
	for i in range(len(nums)-1):
		for j in range(i+1, len(nums)):
			if nums[i] > nums[j]:
				nums[i], nums[j] = nums[j], nums[i]
	return nums

插入排序

插入排序是默认前面的序列是有序的,然后将后面的每个数字依次与前面有序的序列进行比较

  • 时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度为 O ( 1 ) O(1) O(1),稳定。
python 复制代码
def insertSort(nums):
	for i in range(len(nums)-1):
		for j in range(i+1, 0, -1):
			if nums[j] < nums[j-1]:
				nums[j], nums[j-1] = nums[j-1], nums[j]
			else:
				break
	return nums

希尔排序

希尔排序是对插入排序的优化,它选择了一个增量(len(nums)//2),然后按照这个增量选取等差数列,每轮对每个等差数列进行排序,然后将增量缩小,重复进行排列,直到增量缩小为1。

  • 时间复杂度为 O ( n l o g 2 n ) O(nlog_2^n) O(nlog2n),空间复杂度为 O ( 1 ) O(1) O(1),稳定。
python 复制代码
def xier(nums):
	l = len(nums)
	gap = l//2
	while gap>0:
		for i in range(gap, l):
			temp = nums[i]
			j = i
			# j-gap就相当于等差数列进行排序比较
			while j-gap>0 and temp < nums[j-gap]:
				nums[j] = nums[j-gap]
				j = j-gap
			nums[j]=temp
		gap-=1
	return nums

归并排序

合并两个已经排好序的序列以得到结果。是一个递归的过程。

  • 时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度为 O ( n ) O(n) O(n),稳定。
python 复制代码
# 合并两个有序的数组
def merge_two(s1,s2,s):
	i, j = 0, 0
	while (i+j) < len(s):
		# j==len(s2)时说明s2走完了,或者s1没走完并且s1中该位置是最小的
		if j==len(s2) or (i<len(s1) and s1[i] < s2[j]):
			s[i+j] = s1[i]
			i += 1
		else:
			s[i+j] = s2[j]
			j += 1
def merge(s):
	l = len(s)
	if l<2:
		return
	mid = l//2
	s1 = s[0:mid]
	s2 = s[mid:l]
	merge(s1)
	merge(s2)
	merge_two(s1, s2, s)

快速排序

快速排序需要一个基准元素,以及左右两个指针l,r,首先从右端元素开始与基准元素进行比较,找到比基准元素小的数字,放到左端,然后从左端开始寻找比右端大的元素放到r的位置。一轮之后,基准元素左端都是比基准元素小的,右端都是比基准元素大的。然后再依次遍历基准元素左边和右边的序列。

  • 时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),空间复杂度为 O ( 1 ) O(1) O(1),不稳定。
python 复制代码
def quick_sort(nums, start, end):
	if start >= end:
		return
	pivot = nums[start]
	l, r = start, end
	while l<r:
		while l<r and nums[r] > pivot:
			r-=1
		nums[l] = nums[r]
		while l<r and nums[l] < pivot:
			l+=1
		nums[r] = nums[l]
	nums[l] = pivot
	quick_sort(nums, start, l)
	quick_sort(nums, l+1, end)
相关推荐
用户872185012437 分钟前
港股投资者必备:三大数据源对比,哪种最适合实时行情与回测?
python
成旭先生12 分钟前
银行卡识别 API:一张照片读出卡号、BIN 与发卡行
人工智能·算法·ocr·api接口·金融科技·银行卡识别·支付风控
陌上花开缓缓归以22 分钟前
mebdlts3.4.1安全启动全流程
服务器·算法
Nebula_g23 分钟前
JavaSE拓展:可变参数
java·开发语言·算法·安全·javase·可变参数
溪语流沙25 分钟前
【Web全栈进阶】Alembic数据库迁移:改表结构不再删库
前端·数据库·python·elasticsearch·postgresql
Evan_Lai41 分钟前
(一)独热编码、标签编码、目标编码、序数编码详解
python·机器学习
用户76241175670542 分钟前
第二章 Python语言基础
python
129Lab43 分钟前
BMS 核心算法:SOC 估算从安时积分到 LSTM-UKF 串级融合的 30 年演进(附 Python 实现)
python·算法·lstm·python3.11·bms·soc估算
kgkg44 分钟前
我通过逆向学到了douyin的美颜算法
算法
129Lab1 小时前
电池热管理仿真的AI加速:用Python+PINN物理信息神经网络替代传统CFD的可行性探索
pytorch·python·cfd·pinn·物理信息神经网络·仿真加速·电池热管理