堆排序源码(heap sort)
2008-10-08 11:11
399 查看
#include <iostream>
#include <ctime>
using namespace std;
// 注意父子的计算方式。节点编号从0开始。
inline int parent(const int x) { return ((x-1)/2); }
inline int left(const int x) { return (2*x+1); }
inline int right(const int x) { return (2*x+2); }
int cmp = 0; // 总共执行比较操作的次数
int swp = 0; // 总共执行交换操作的次数
// 调整以i为根的子树,使之成为最大堆,size为堆的大小
void maxHeapify(int a[], int size, int i)
{
cmp +=2;
swp++;
int l = left(i);
int r = right(i);
int largest = i; // 最大堆的根
if( (l < size) && (a[l] > a[i]) ) largest = l;
if( (r < size) && (a[r] > a[largest]) ) largest = r;
if( largest != i )
{
swap(a[i], a[largest]); // 三个节点中较大者成为根
maxHeapify(a, size, largest); // 可能破坏了堆性质,重新调整
}
}
void buildMaxHeap(int a[], int size) // 建堆
{
for(int i = (size-1)/2; i>=0; i--)
{
maxHeapify(a, size, i);
}
}
void heapSort(int a[], int size) // 堆排序,(n-1)*O(lgn) = O(nlgn)
{
swp++;
buildMaxHeap(a, size);
for(int i=size-1; i>0; i--) // 重复n-1次
{
swap(a[0], a[i]);
size--;
maxHeapify(a, size, 0); // 每次调整,花费为O(lgn)
}
}
int main()
{
int a[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
heapSort(a, sizeof(a)/sizeof(a[0]));
cout << "总共进行比较 " << cmp << " 次,总共进行交换 " << swp << " 次" << endl;
for(int i=0; i<sizeof(a)/sizeof(a[0]); i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
#include <ctime>
using namespace std;
// 注意父子的计算方式。节点编号从0开始。
inline int parent(const int x) { return ((x-1)/2); }
inline int left(const int x) { return (2*x+1); }
inline int right(const int x) { return (2*x+2); }
int cmp = 0; // 总共执行比较操作的次数
int swp = 0; // 总共执行交换操作的次数
// 调整以i为根的子树,使之成为最大堆,size为堆的大小
void maxHeapify(int a[], int size, int i)
{
cmp +=2;
swp++;
int l = left(i);
int r = right(i);
int largest = i; // 最大堆的根
if( (l < size) && (a[l] > a[i]) ) largest = l;
if( (r < size) && (a[r] > a[largest]) ) largest = r;
if( largest != i )
{
swap(a[i], a[largest]); // 三个节点中较大者成为根
maxHeapify(a, size, largest); // 可能破坏了堆性质,重新调整
}
}
void buildMaxHeap(int a[], int size) // 建堆
{
for(int i = (size-1)/2; i>=0; i--)
{
maxHeapify(a, size, i);
}
}
void heapSort(int a[], int size) // 堆排序,(n-1)*O(lgn) = O(nlgn)
{
swp++;
buildMaxHeap(a, size);
for(int i=size-1; i>0; i--) // 重复n-1次
{
swap(a[0], a[i]);
size--;
maxHeapify(a, size, 0); // 每次调整,花费为O(lgn)
}
}
int main()
{
int a[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7};
heapSort(a, sizeof(a)/sizeof(a[0]));
cout << "总共进行比较 " << cmp << " 次,总共进行交换 " << swp << " 次" << endl;
for(int i=0; i<sizeof(a)/sizeof(a[0]); i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
相关文章推荐
- 堆排序 Heap Sort
- STL 源码分析《1》---- list 归并排序的 迭代版本, 神奇的 STL list sort
- 堆排序(heapsort)
- Spark算子[13]:sortByKey、sortBy、二次排序 源码实例详解
- java 集合中的Collections.sort()排序方法的源码分析(一)
- PAT - 甲级 - 1098. Insertion or Heap Sort (25)(排序)
- 基本排序方法及分析(七):HeapSort 堆排序
- 选择排序之堆排序(HeapSort)
- 选择排序算法:堆排序-Heap Sort
- 09-排序3 Insertion or Heap Sort
- 堆积排序(HeapSort) - 改良的选择排序
- Atitit 算法之道 attilax著 1. 第二部分(Part II) 排序与顺序统计(Sorting and Order Statistics) 1 2. 第六章 堆排序(Heapsort)
- 09-排序3 Insertion or Heap Sort
- STL源码——list sort:归并排序的非递归实现
- 【数据结构】中的堆(HeapSort)排序
- 结合redis设计与实现的redis源码学习-23-排序(sort.c)
- 09-排序3 Insertion or Heap Sort
- 【内省式排序】能不能让sort排序在某种情况下更快呢?阅读sort源码后有感...
- 《Spark商业案例与性能调优实战100课》第35课:彻底解密Spark 2.1.X中Sort Shuffle中TimSort排序源码具体实现
- 09-排序3 Insertion or Heap Sort