常用算法
排序算法
堆排序
-
特点:
- 堆是一颗逻辑上的完全二叉树,其存储物理结构为顺序结构
- 堆排序是利用堆这种数据结构设计的一种排序算法,是一种选择排序
- 大根堆:堆中每个节点的值都大于或等于其左节点、右子节点的值,一般用于升序排序中
- 小根堆:堆中每个节点的值都小于或等于其左节点、右子节点的值,一般用于降序排序中
- 在做堆排序时,通过持续将无序数据构建成大根堆(小根堆),然后将最大值(最小值)与最后一个位置的元素交换;再将堆的节点数减小1个节点,重建成大根堆(小根堆);最后堆的节点数为1时,整个物理结构的数据即为升序(降序)
- 复杂度
- 时间复杂度:O(nlogn)
- 空间复杂度:O(1)
- 稳定性:不稳定
-
排序过程(升序):
-
详细示例见附件中merge\MergeSort.java
快速排序
- 特点:
- 需要取一个基准值,记为pivot
- 将数据(记为数组data,起始下标记为start、end),然后分别按下标从右往左、从左往右与基准值进行循环比较
- 复杂度
- 时间复杂度:O(logn)
- 空间复杂度:O(logn)
- 稳定性:不稳定
- 逻辑:
- 比较开始时,记录初始下标值left=start、right=end,取基准值为最左值pivot=data[left]
- 【循环】条件是left<right,将基准值(pivot)放置到合理位置,最后让基准值左侧都小于基准值,右侧都大于基准值
- 【子循环】从右往左循环比较,找出第1个小于基准值的数据
- 如果当前下标位置的值大于基准值(data[right]>pivot),下标位置左移1位(right--),进行下轮循环
- 如果当前下标位置的值小于等于基准值(data[right]<=pivot),结束循环
- 将最左下标值替换为退出循环的小于等于基准值的数据data[left]=data[right]
- 【子循环】从左往右循环比较,找出第1个大于基准值的数据
- 如果当前下标位置的值小于基准值(data[left]<pivot),下标位置右移1位(left++),进行下轮循环
- 如果当前下标 位置的值大于等于基准值(data[left]>=pivot),结束循环
- 将最右下标值替换为退出循环的大于等于基准值的数据data[right]=data[left]
- 【子循环】从右往左循环比较,找出第1个小于基准值的数据
- 【递归】在上述循环后结束后,将基准值放到left==right的位置 ,然后对小于基准值的数据和大于基准值的数据再进行上述1-3个步骤的逻辑
- 排序过程(升序):
- 详细示例见附件中quick\QuickSort.java
欢迎来到testingpai.com!
注册 关于