排序

排序

稳定性问题:当出现同一数值时,可以正确处理的方法即为稳定排序

时间空间稳定性一般不可兼得。

一.快速排序

思路:将一个数放到确定位置,此位置称为轴(Pivot),让后递归完成结果

1.解法1

在数组的两端设置两个指针,一个从左往右走,一个从右往左走,左侧的需要放比轴小的,右侧放比轴大的,在两侧指针都不满足的时候两个指针位置进行交互,在两边指针相互越过的时候停止。然后交换轴

接下来对左右两侧进行递归处理,完成快排。

2.解法2

二.归并排序(Merge,二路归并)

思路:两个有序数组 -> 一个有序数组(相当于两个有序的顺序表合并为一个顺序表,时间复杂度 O(N+M)

时间复杂度: O(nlogn)  每一趟需要 N 复杂度 执行 logN

空间复杂度 O(n)

稳定排序算法

特殊情况:

三.堆排

完全二叉树,在无守卫的时候: 父节点 = (n-1) /2  左子树 = n*2+1  右子树 = n*2+2

思路:将数组建立一个逻辑上的堆

  1. 调整到满足最大堆的定义
  2. 将堆顶与最后一个元素交换,相当于删除了这个最大元素,重新构成了一个堆,重新调整到符合堆。

时间复杂度:O(nlogn)

空间复杂度:O(1)

不稳定排序