算法学习笔记(六)

根据时间复杂度的不同,可以将排序算法分为三大类:
1,时间复杂度为O(n*n):

冒泡排序
选择排序
插入排序
希尔排序

2,时间复杂度为O(nlogn)的排序算法
快速排序
归并排序
堆排序

3,时间复杂度为线性的排序算法
计数排序
桶排序
基数排序

除此之外其他的排序都是基于传统排序演变的。

其次还可以根据稳定性,分为稳定排序和不稳定排序。
稳定排序:如果值相同的元素在排序后仍然保持着排序前的顺序,则这样的排序算法是稳定排序。
不稳定排序:如果值相同的元素在排序后打乱了排序前的顺序,则这样的排序算法是不稳定排序。

一,冒泡排序

何为冒泡排序:就是把相邻的元素两两相比较,当一个元素大于右边的相邻元素时,交换位置,若反之小于则位置不变,相邻的这个元素继续和右边的相邻元素进行比较,这样依次向右比较,第一轮比较完之后最后一个元素一定是最大的元素。然后又从头开始第二轮比较。依次类推,反复重复,重复数组长度-1之后,数组元素一定是从左到右都是从大到小的排列。

冒泡排序是一种稳定排序,值相等的元素不会打乱原本的顺序,该算法每一轮都要遍历所有元素,总共遍历(元素长度-1)次,时间复杂度为O(n*n);
代买示例:
在这里插入图片描述

二,冒泡排序的优化
当元素排列到最后,顺序已经是有序的按照从小到大的顺序时,已经可以不用继续遍历了。此时,我们可以给它加一个标识位,当没有元素进行赋值时,跳出循环。
代码如下:

在这里插入图片描述

第二种优化:
当元素为43256789时,可以看出后面五位的顺序已经是从小到大的排列。在遍历时可以无需进行遍历,这样可以对提高排序的性能。
此时,我们应该记录下最后一次赋值的位置。遍历的最大长度为该位置的值就行。
代码如下:
在这里插入图片描述

三,鸡尾酒排序
冒泡排序的每一轮排序都是从左到右来比较元素,位置进行互换是单向的。而鸡尾酒排序则是双向的。即为先左到右,再右向左,依次类推,就像指针的左右摆动。

所以遍历的过程就变成了两种:奇数轮和偶数轮。则将遍历分成了数组元素长度的一半。
代码如下:
在这里插入图片描述

代码外层的大循环控制着所有排序回合,大循环内部两个小循环,第一个是奇数轮,从左到右,第二个偶数轮,从右到左,这样相当于第一个大循环只走两边,就将排序完成了,提高了很大的性能。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值