5种常见的排序算法

选择排序

伪算法:

function SelectionSort(A, n)
	for i = n-1 downto 1
		max_index = 0	//选取一位标志位为最大元素下标
		for j = 1 to i
			if A[j] > A[max_index]	
			//如果j所指向的数字大于标志位的数字时,将max_index指向j
			max_index = j
		SWAP(A[j], A[max_index])	//交换j和max_index的数值

冒泡排序

伪算法:

function BubbleSort(A, n)
	for i=n-1 downto 1
	#将A[0,...,i]从左向右冒泡,最大的数将出现在最右边
		for j=0 to i-1
			if A[j] > A[j+1]
				SWAP(A[j], A[j+1])

优化:

function BubbleSort(A, n)
	for i=n-1 downto 1
	Swapped = Flase
	#将A[0...i]从左向右冒泡,最大的数将出现在最右边
		for j=0 to i-1
			if A[j] > A[j+1]
			//如果前一位数字大于后一位数字,则交换数值
				SWAP(A[j], A[j+1])
				Swapped = True
		if not Swapped
			break

插入排序

类似于抓扑克牌
伪算法:

function InsertSort(A, n)
	for i=1 to n-1
	#将A[i]插入到已排好序的A[0,...,i-1]中
	new_card = A[i]
	j = i-1
	while j>=0 and A[j] > new_card	
	//当j所指向的手牌比要插入的新牌大时,需要向右移动这张手牌,并将指针j左移一位
		A[j+1] = A[j]
		j = j-1
	A[j+1] = new_card	//当new_card大于j所指向的数字时,将new_card插入到j+1的位置
最好时间复杂度最坏时间复杂度平均时间复杂度
选择排序O(n²)O(n²)O(n²)
冒泡排序O(n)O(n²)O(n²)
插入排序O(n)O(n²)O(n²)
  • 一般情况下,时间复杂度,选择最慢,冒泡次之,插入相比较快
  • 在数据规模小的情况下,选择插入排序

归并排序

  • 算法核心思想:分治法,将原问题分成子问题,分别解决,合成答案
    1、将序列中待排序数字分为若干组,每个数字为一组
    2、将若干个组两两合并,保证合并后的组是有序的
    3、重复第二步操作知道只剩下一组,排序完成
  • 时间复杂度:O(n*logn)
  • 空间复杂度:O(n)
  • 应用:合并有序链表,链表的元素访问方式是顺序访问

快速排序

  • 基本思想:
    1、选定 pivot 中心轴(一般选取最左边的数字)
    2、将大于 pivot 的数字放在 pivot 的右边
    3、将小于 pivot 的数字放在 pivot 的左边
    4、分别对左右子序列重复前 3 步操作
  • 最坏时间复杂度:O(n²)
  • 平均时间复杂度:O(nlogn)
  • 最好时间复杂度:O(nlogn)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值