前言
排序算法,在职业生涯中,时常有用到,不论是在项目中,还是在面试中。
在这里记录一下常用的排序算法,也给自己插个眼。
排序算法分为:冒泡排序、插入排序、选择排序、快速排序、希尔排序、堆排序、基数排序、归并排序八大排序。
时间复杂度和空间复杂度
排序方法 | 时间复杂度(平均) | 时间复杂度(最好) | 时间复杂度(最坏) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n^2) | O(n) | O(1) | 稳定 |
插入排序 | O(n^2) | O(n^2) | O(n) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n) | O(1) | 不稳定 |
快速排序 | O(nlog2n) | O(n^2) | O(nlog2n) | O(nlog2n) | 不稳定 |
希尔排序 | O(n^1.3) | O(n^2) | O(n) | O(1) | 不稳定 |
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 |
基排序 | O(n*k) | O(n*k) | O(n*k) | O(n+k) | 稳定 |
冒泡排序
思路:
- 比较相邻的元素。如果第一个比第二个大,就交换它们两个.
- 对每一个相邻元素做同样的工作,从开始第一对到结尾的每一对。在这一 点,最后的元素应该会是最大的数。
- 针对多有的元素重复以上的步骤,除了最后一个。
/// <summary>
/// 冒泡排序
/// </summary>
/// <param name="arry">排序数组</param>
public void BubbleSort(int[] arry)
{
int count = arry.Length;
for (int i = 0; i < count; i++)
{
for (int j = count-1; j < i; j++)