堆排序
2017-05-16 13:55
176 查看
堆排序:堆排序其实和选择排序一样
如果对堆进行升序排序应该建一个大堆
如果对堆进行降序排序应该建一个小堆
首先进行升序排序
堆排序的过程
1、
2、
3、
…….
一直循环交换调整直到a[0]和a[0]交换的时候循环终止,这话i后排序已经完成
排序的算法,升序排序依赖于建一个大堆
首先先建立一个大堆
建堆的时间复杂度
N*lgN
再加上向下调整算法的时间复杂度
N*lgN(近似的认为N *lgN)
因此排序的时间复杂度为O(N* lgN + N* lgN)=O(N*lgN)
降序排序则改变下向下调整算法的>符号改成<符号即可
如果对堆进行升序排序应该建一个大堆
如果对堆进行降序排序应该建一个小堆
首先进行升序排序
堆排序的过程
1、
2、
3、
…….
一直循环交换调整直到a[0]和a[0]交换的时候循环终止,这话i后排序已经完成
排序的算法,升序排序依赖于建一个大堆
首先先建立一个大堆
建堆的时间复杂度
N*lgN
再加上向下调整算法的时间复杂度
N*lgN(近似的认为N *lgN)
因此排序的时间复杂度为O(N* lgN + N* lgN)=O(N*lgN)
#include<iostream> #include<stdlib.h> #include<vector> using namespace std; void AdjustDown(int *heap,int size,int root) { int parent = root; int child = parent * 2 + 1;; while (child < size) { if (child+1<size&&heap[child]<heap[child + 1]) { ++child; } if (heap[child]>heap[parent]) { swap(heap[child], heap[parent]); parent = child; child = parent * 2 + 1; } else { break; } } } void SortHeap(int *arr, size_t n) { for (int i = (n - 2) / 2; i >= 0; --i) { AdjustDown(arr,n,i); }//建堆 for (int i = n-1; i > 0; --i) { swap(arr[0], arr[i]); AdjustDown(arr,i,0); }//开始进行排序 } int main() { int arr[10] = { 10, 11, 13, 12, 16, 18, 15, 17, 14, 19 }; int n = sizeof(arr) / sizeof(arr[0]); SortHeap(arr, n); for (int i = 0; i <n ; i++) { cout << arr[i] << " "; } system("pause"); return 0; }
降序排序则改变下向下调整算法的>符号改成<符号即可
相关文章推荐
- 插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序算法比较
- 算法 2.4节 堆排序及其改进、索引优先队列
- 堆排序
- 堆的创建与应用以及堆排序
- 漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析
- 数据结构(五)堆排序
- 排序算法(堆排序)
- 排序算法-堆排序的详细解释
- 排序算法一(直接选择,堆排序,冒泡排序和快速排序)
- 排序方法了解一下(冒泡排序、选择排序、堆排序、插入排序、希尔排序、归并排序、快速排序、基数排序)
- 算法导论——第二章——堆排序
- 快速排序 Vs. 归并排序 Vs. 堆排序——谁才是最强的排序算法
- 堆排序
- 算法学习——堆排序
- 《算法导论》第6章 堆排序 (1)最大堆与堆排序
- C/C++ 数组排序(平均时间复杂度 O(nlogn))归并、快速、堆、希尔之堆排序
- 《算法导论》第6章 堆排序 (4)Young氏矩阵
- 今天开始学Java 排序算法之堆排序
- 归并排序,快速排序,堆排序,冒泡排序 c语言源代码
- 基于Java实现堆排序