这个系列主要写常见的基础算法手写实现,代码会附在github上。
术语解释
1、稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 仍然在 b 的前面,则为稳定排序。
2、非稳定排序:如果 a 原本在 b 的前面,且 a == b,排序之后 a 可能不在 b 的前面,则为非稳定排序。
3、原地排序:原地排序就是指在排序过程中不申请多余的存储空间,只利用原来存储待排数据的存储空间进行比较和交换的数据排序。
4、非原地排序:需要利用额外的数组来辅助排序。
5、时间复杂度:一个算法执行所消耗的时间。
6、空间复杂度:运行完一个算法所需的内存大小。
堆排序 & 优先队列
堆排序和优先队列的思路是一样的:维护一个有序堆。
具体图解堆排序可以参考这个:https://www.cnblogs.com/chengxiao/p/6129630.html
堆排序维护的不是一颗树,而是一个数组。
堆排序的核心算法在于上浮和下沉过程。
上浮指的是:新加入堆的元素放到最后一个位置(即Arraylist或vector的最后一位),然后把该新加入的元素上浮到合理的位置,使之重新成为一个有序的堆。
void MyPriorityQueue::popup() {
int length = MyPriorityQueue::vec.size();
int childrenIndex = length - 1;
while(true) {
if(length == 1 || length == 0 || childrenIndex == 0)
break;
else {
int parentIndex = (childrenIndex - 1) / 2;
if(MyPriorityQueue::vec[parentIndex] > MyPriorityQueue::vec[childrenIndex]) {
int parent_value = MyPriorityQueue::vec[parentIndex];
int children_value = MyPriorityQueue::vec[childrenIndex];
MyPriorityQueue::vec[parentIndex] = children_value;
MyPriorityQueue::vec[childrenIndex] = parent_value;
childrenIndex = parentIndex;
} else
break;
<