快速排序
快速排序的核心是找到一个锚点,然后再将其他小于锚点的数据排到锚点的左边,大于锚点的数据排到锚点的右边,然后再对锚点左右两边的数据递归进行此操作直到排序完成
稳定性:不稳定
平均复杂度:O(nlogn)
代码:https://github.com/ETinyfish/ds_and_al/commit/6a97afa42a4d9432aaa642bf1fe342354bbd008f
堆排序
堆排序的主要原理是利用堆这种数据结构来进行排序。
大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列
小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列
主要步骤为将待排序的序列创建为一个堆,然后把堆首和堆尾元素互换,下一步再将堆的尺寸缩小1,并调用shiftdown目的是吧新的数组顶端数据调整到相应的位置,最后再重复步骤知道堆的尺寸为1
难点在于怎么构建堆!以构建大顶堆为例来说构建堆的大致思想为:从最后一个非叶子节点开始(叶子节点也不用构建),对该非叶子节点,该非叶子节点的左子树右子树进行大小比较与交换来保证非叶子节点位置的值为最大值,然后再对下一个非叶子节点进行此操作,直到整个二叉树遍历完毕。
复杂度:O(nlogn)
稳定性:不稳定
代码:https://github.com/ETinyfish/ds_and_al/blob/main/%E5%A0%86%E6%8E%92%E5%BA%8F
插入排序
插入排序很简单,类似于打扑克牌,从待排序序列中选一个数字作为有序序列(通常选第一个),然后再从剩余待排序序列中一个一个数字的抽取,并将它与待抽取的有序数字做比较,并插到合适的位置
复杂度:O(n^2)
稳定性:稳定
代码:https://github.com/ETinyfish/ds_and_al/blob/main/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F
选择排序
复杂度:O(n^2)
稳定性: 不稳定
代码: https://github.com/ETinyfish/ds_and_al/commit/598ac882c04c3f45b577ab995e204280c281f21b
二分查找算法
二分查找算法用于对有序序列中的数据进行查找运算,它的主要原理是折半思想,对于待查找数字,首先将它与有序序列中的中间元素进行比较,若待查找数字等于有序序列中间元素,则直接返回,若待查找数字小于中间元素,则将查找范围缩小到首元素到中间-1位置的元素,若待查找数字大于中间元素,则将查找范围缩小到中间+1位置的元素到最后一个元素之间,然后依次类推,这里面需要注意的一点是中间+1与中间-1
代码:https://github.com/ETinyfish/ds_and_al/blob/main/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE%E7%AE%97%E6%B3%95