「这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战」
冒泡排序
冒泡原理
冒泡排序相信是很多人入门必学算法,是打开我们走向算法大门的钥匙,这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
原理:比较两个相邻的元素,将值大的元素交换到右边
直观表达:每一趟遍历,将一个最大的数移到序列末尾
算法实现
1、算法描述
比较相邻的元素,如果前一个比后一个大,交换之。
第一趟排序第1个和第2个一对,比较与交换,随后第2个和第3个一对比较交换,这样直到倒数第2个和最后1个,将最大的数移动到最后一位。
第二趟将第二大的数移动至倒数第二位
……
2、图示
3、算法空间复杂度和时间复杂度
时间复杂度:
- 最坏:o(n2n^{2 }n2)
- 最好:o(nn^{}n)
- 平均:o(n2n^{2 }n2)
空间复杂度(辅助存储):o(1)
稳定性:稳定
例题
-》用冒泡排序将以下数列按照从小到大的顺序输出:
123,45,6,22,99,1,38,41,-6,0
java代码:
1 | java复制代码public class Test { |
快速排序
快排原理
同样的,必学算法之一。快速排序(Quicksort)是对冒泡排序算法的一种改进。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。
算法实现
1、算法描述
快速排序,说白了就是给基准数据找其正确索引位置的过程.
- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
2、图示
3、算法空间复杂度和时间复杂度
时间复杂度:
- 最坏:o(n2n^{2}n2)
- 最好:o(nlog2nn\log _{2}nnlog2n)
- 平均:o(nlog2nn\log _{2}nnlog2n)
空间复杂度(辅助存储):o(nlog2nn\log _{2}nnlog2n)
稳定性:不稳定
例题
用快速排序将以下数列按照从小到大的顺序输出:
-》66,13,51,76,81,26,57,69,23
java代码:
1 | java复制代码public class Test { |
本文转载自: 掘金