排序:堆排序
2017-08-05 11:46
99 查看
#include <stdio.h> // 交换函数 void swap (int a[], int i, int j) { int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } // 打印数组 void printA (int *a, int len) { int i; for (i = 0; i < len; i++) { printf ("%4d", a[i]); } printf ("\n"); } // a 代表一个数组 // i 代表要调整的结点的下标 // len 数组的长度 void heapify(int *a, int i, int len) { int left = 2 * i + 1; // 左孩子结点下标 int right = 2 * i + 2; // 右孩子结点下标 int max = i; // 三个节点中最大元素的下标 if (left < len && a[left] > a[max]) max = left; if (right < len && a[right] > a[max]) max = right; if (max != i) // 当前父节点不是所有结点中最大的元素,需要做调整 { swap (a, i, max); heapify (a, max, len); // 调整被交换的结点 } } void heapSort (int *a, int len) { // 建堆 int i; for (i = len/2 - 1; i >= 0; i--) { heapify (a, i, len); } // 排序 for (i = len-1; i > 0; i--) { swap (a, 0, i); // 拿堆顶元素与队尾元素进行交换 len--; // 找到一个最大元素以后堆大小减1 heapify (a, 0, len); // 调整堆顶元素 } } int main() { int a[10] = {9,6,8,0,3,5,2,4,7,1}; int len = sizeof(a) / sizeof(a[0]); heapSort(a, len); printA (a, len); return 0; }
相关文章推荐
- 【数据结构与算法】【排序】堆排序的代码实现
- 选择排序,冒泡排序,归并排序,快速排序,堆排序等等
- 快速排序-堆排序-STL中的堆排序-归并排序 》时间比较
- 选择排序-堆排序
- 快速排序、堆排序、归并排序
- 基础算法(二):堆排序,快速排序
- 归并排序,快速排序,堆排序,冒泡排序 c语言源代码
- 排序(三)之堆排序
- 排序----堆排序
- 改进排序:希尔排序、堆排序
- [C++]数据结构:排序算法Part1----冒泡排序、选择排序、插入排序、堆排序
- 快速排序,插入排序,归并排序,计数排序,基数排序,堆排序
- 选择排序之堆排序(HeapSort)
- 选择排序之--堆排序
- 排序(四)堆排序
- 选择排序:直接选择排序 堆排序
- 学习笔记--- 比较排序之堆排序
- 我---对‘数据结构’中‘排序’的理解 ---------3:选择排序--(二)堆排序
- 数据结构学习笔记 --- 排序(选择排序、堆排序)
- boj problem 1329 快速排序tle 堆排序还可以~~需要熟悉快速排序和堆排序~~静态数组全局下可以很大 但main下不行 具体看1331那篇