ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

一些常用的排序算法 (包含源码)

2022-09-11 13:31:55  阅读:235  来源: 互联网

标签:right 复杂度 元素 li 算法 源码 排序 left


1 低效率排序

1.1 冒泡排序

排序原理:冒泡排序的原理是通过让较大的数依次往后排或往前排,或者是较小的数依次往后排或前排
image

代码实现:

def bubbling(li):
	for i in range(len(li) - 1):  # 排序躺数,比如一个有三个元素的数列需要将两个元素进行排序
		for j in range(1, len(li) - i):
			if li[j - 1] > li[j]:
				li[j - 1], li[j] = li[j], li[j - 1]

算法效率:
时间复杂度:O(n2)
空间发杂度:O(1)

1.2 选择排序

排序原理:从头至尾扫描序列,找出最小的一个元素,和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序序列。
image
代码实现:

def select_sort(li):
	for i in range(len(li) - 1):  # 排序趟数
		for j in range(i, len(li)):
			if li[j] > li[i]:
				li[i], li[j] = li[j], li[i]

算法效率:
时间复杂度:O(n2)
空间发杂度:O(1)

1.3 插入排序

排序原理:插入排序的代码实现虽然没有冒泡排序和选择排序那么简单粗暴,但它的原理应该是最容易理解的了,因为只要打过扑克牌的人都应该能够秒懂。插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

代码实现:

def insert_sort(li):
	for i in range(1, len(li)):
		j = i - 1
		current_num = li[i]
		while j >= 0 and current_num <= li[j]:
			li[j + 1] = li[j]
			j -= 1
		li[j + 1] = current_num
	return li

算法效率:
时间复杂度:O(n2)
空间发杂度:O(1)

2 高效率排序

2.1 快速排序

排序原理:排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数(这只是个专用名词)。为了方便,我们一般选择第 1 个数字作为基准数(其实选择第几个并没有关系)。接下来我们需要把这个待排序的数列中小于基准数的元素移动到待排序的数列的左边,把大于基准数的元素移动到待排序的数列的右边。这时,左右两个分区的元素就相对有序了;接着把两个分区的元素分别按照上面两种方法继续对每个分区找出基准数,然后移动,直到各个分区只有一个数时为止。

代码实现:

def quick_sort(li):
	import random
	def _partition(li, left, right):
		ran = random.randint(left, right)  # 随机选值,减小最坏情况发生
		tmp = li[ran]  # 用最左端的数回填取出的数
		li[ran] = li[left]
		while left < right:
			while left < right and li[right] >= tmp:
				right -= 1
			li[left] = li[right]
			while left < right and li[left] <= tmp:
				left += 1
			li[right] = li[left]
		li[left] = tmp
		return left

	def _quick_sort(li, left, right):
		if left < right:
			middle = _partition(li, left, right)
			_quick_sort(li, left, middle - 1)
			_quick_sort(li, middle + 1, right)

	_quick_sort(li, 0, len(li) - 1)

算法效率:
时间复杂度:O(nlog2n)
空间复杂度:O(log2n)

2.2 堆排序

排序原理:堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样根节点会是n个元素中的次小值,将其与n-1的元素互换,剩下n-2个元素继续建堆。如此反复执行,便能得到一个有序序列了。(反之,降序则建立小顶堆)
代码实现:

def sift(li, low, height):
	i = low
	j = 2 * i + 1
	tmp = li[i]
	while j <= height:
		if j + 1 <= height and li[j] < li[j + 1]:
			j += 1
		if li[j] > tmp:
			li[i] = li[j]
			i = j
			j = 2 * i + 1
		else:
			break
	li[i] = tmp


def heap_sort(li):
	n = len(li) - 1
	for i in range((n - 1) // 2, -1, -1):
		sift(li, i, n)
	for i in range(n, 0, -1):
		li[0], li[i] = li[i], li[0]
		sift(li, 0, i - 1)

算法效率:
时间复杂度:O(nlog2n)
空间复杂度:O(1)


待续

标签:right,复杂度,元素,li,算法,源码,排序,left
来源: https://www.cnblogs.com/mress/p/16683853.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有