排序算法:堆排序
2017-03-20 22:35
417 查看
简介
堆排序(使用大堆,升序)从基本实现原理来说也是一种选择排序,它同样是确定了位置选择符合位置的元素,但是堆排序是更加优化的选择排序的版本,它利用了堆的特性。父结点的值大于子结点,且满足完全二叉树,大大提高了选择排序的效率。算法描述
1.对无序数组建立堆(大堆)模型,堆模型满足父结点值大于子结点值,且抽象出来的是完全二叉树;
2.把堆顶最大值与堆尾最后一个值交换,最大值就归到正确位置(有序区),之后有序区不参与调整;
3.从堆顶开始调向下整堆;
4.重复上面两步,直到数组有序。
时间复杂度
:建堆的时间复杂度为O(N),每次调整的时间复杂度为log2N(2为底),要调N-1次所以整个调整就为(N-1)*log2N(2为底),整个堆排序时间复杂度 O(N)+(N-1)O(log2N),简化后即O(N*log2N)。代码实现
void AdjustDown(int* arr, size_t root, size_t count) {//堆排序调整 size_t parent = root; size_t child = parent * 2 + 1; while (parent<count) { if (child + 1 < count&&arr[child + 1]>arr[child]) { ++child; } if (child<count&&arr[child] > arr[parent]) { std::swap(arr[child], arr[parent]); parent = child;//向下调整父结点,继续调整 child = parent * 2 + 1; } else { break; } } } void HeapSort(int* arr, size_t size) {//堆排序 for (int i = (size - 1) / 2; i >= 0; i--) {//建堆过程,从数组中抽象出父结点大于子结点的完全二叉树 AdjustDown(arr, i, size); } size_t end = size - 1; while (end > 0) { swap(arr[0], arr[end]); AdjustDown(arr, 0, end); end--; } } int main() { int a[] = {1,8,3,6,5,2,4}; HeapSort(a, sizeof(a) / sizeof(a[0])); for (int i = 0; i < (sizeof(a) / sizeof(a[0]));i++) cout << a[i] << ' '; return 0; }
相关文章推荐
- 排序算法之堆排序
- 排序算法---堆排序
- 漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析
- 排序算法Java实现(堆排序)
- Java实现排序算法——堆排序
- 几种常见的排序算法,选择排序,冒泡排序,希尔排序,堆排序,快速排序,归并排序,基数排序的比较
- 排序算法---堆排序
- 基本排序算法——堆排序
- 排序算法——堆排序
- 几种排序算法综合比较(快速,归并,希尔,堆排序等)
- 排序算法整理(6)堆排序的应用,top K 问题
- 排序算法(七)——堆排序
- 排序算法之堆排序
- 图解排序算法(三)之堆排序
- 排序算法(四):优先队列、二叉堆以及堆排序
- 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
- 排序算法:堆排序
- 常用排序算法——堆排序
- C:C的排序算法:堆排序(HeapSort)
- 排序算法 堆排序