冒泡排序、堆排序、插入排序、归并排序
冒泡排序
平均时间复杂度O(n²) 空间复杂度O(1) 最好情况O(n) 最坏情况O(n²) 稳定
流程:
第一趟排序,把最大的数排到最后;第二趟排序,把第二大的数排到倒数第二位…
1 | public static void BubbleSort(int[] arr){ |
堆排序
平均时间复杂度O(nlogn) 空间复杂度O(1) 最好情况O(nlogn) 最坏情况O(nlogn) 不稳定
流程:
- 将无序序列构成一个堆,根据
升序``降序
需求选择大顶堆
或小顶堆
。 - 将堆顶元素与末尾元素交换,将最大元素“沉”到数组末端。
- 重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素。
- 反复执行
调整
+交换
步骤,直到整个序列有序。
1 | public static void heapSort(int[] arr){ |
插入排序
平均时间复杂度O(n²) 空间复杂度O(1) 最好情况O(n) 最坏情况O(n²) 稳定
流程:
- 将数组分为
有序区
和无序区
。 - 第一轮的有序区就是
[0]
。 - 每一轮从无序区中取第一个数与整个有序区的数从后往前进行比较。
- 找到适当的插入位置插入,
有序区+1
,无序区-1
。
1 | public static void insertSort(int[] arr){ |
归并排序
平均时间复杂度O(n²) 空间复杂度O(n) 最好情况O(n) 最坏情况O(n²) 稳定
流程:分+治
- 分阶段:将数组进行划分,直到不能再划分。
- 治阶段:
- 将已有序的子序列进行两两合并。
- 遍历两个合并的子序列,按规则填充到
temp
数组中。 - 填充完毕后
temp
数组中就是两个有序子序列合并后的有序序列。 - 将
temp
数组中的元素复制回原数组的相应区间中。
1 | //分+治 |