堆排序--采用快速排序(利用大堆实现升序,小堆实现降序)
2016-05-02 21:53
351 查看
对堆进行排序,利用大堆实现升序,小堆实现降序。例如升序的实现,将较大数据存放在最后面,依次往前存放数据。具体为交换第一个元素和最后一个元素,再将不包含最后一个元素的堆进行下调,使堆保持大堆,将最大数据存放在堆中第一个位置,循环执行上述步骤,直到需要下调的数据个数为0.
void AdjustDown(int *a, size_t root, size_t size)//下调--k为数组下标,size为数组元素个数 {//大堆 size_t parent = root; size_t child = parent * 2 + 1; while (child < size) { if (child + 1 < size && a[child] < a[child + 1]) { ++child; } if (a[parent] < a[child]) { swap(a[parent], a[child]); parent = child; child = parent * 2 + 1; } else//注意不满足交换条件时跳出本次循环 { break; } } } void HeapSort(int *a, size_t size)//堆排序--采用快速排序(利用大堆实现升序,小堆实现降序) { assert(a); for (int i = ((int)size-2)/2; i >= 0; --i)//建堆 { AdjustDown(a, i, size);//下调i为堆顶的堆 } for (size_t i = 0; i < size; ++i) {//由于该堆为大堆,则把第一个元素和最后一个元素进行交换,再进行下调 swap(a[0], a[size - 1 - i]);//交换堆顶数据和最后一位的数据,使最后一个元素存放最大(小)数 //size-1-i为进行下调的元素个数,每交换一次减1,使最后一个元素不参与下调,下调使堆顶存放size-1-i个数中最大(小)数 AdjustDown(a, 0, size - 1 - i); } }测试用例如下:
void Test() {//堆排序 int arr[] = { 10, 16, 18, 12, 11, 13, 15, 17, 14, 19 }; size_t size = sizeof(arr) / sizeof(arr[0]); HeapSort(arr, size); for (size_t i = 0; i < size; ++i) { cout << arr[i] << " "; } cout << endl; }
相关文章推荐
- 堆排序
- C#堆排序实现方法
- 解析PHP中数组元素升序、降序以及重新排序的函数
- Java数据结构及算法实例:选择排序 Selection Sort
- Java中的数组排序方式(快速排序、冒泡排序、选择排序)
- php堆排序实现原理与应用方法
- Java经典算法汇总之选择排序(SelectionSort)
- PHP简单选择排序算法实例
- C++堆排序算法的实现方法
- 深入理解堆排序及其分析
- C语言对堆排序一个算法思路和实现代码
- VC++实现选择排序算法简单示例
- Java实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等
- JAVA算法起步之堆排序实例
- Java排序算法总结之堆排序
- java实现选择排序算法
- Java排序算法总结之选择排序
- Python选择排序、冒泡排序、合并排序代码实例
- 用php实现选择排序的解决方法
- python选择排序算法的实现代码