堆排序
来源:互联网 发布:linux file命令 编辑:程序博客网 时间:2024/06/11 01:33
堆分为大根堆(双亲节点大于孩子节点)和小根堆(双亲节点小于孩子节点)
一般用数组来表示堆。当一个节点的下标为i时,它的左右孩子下标为2*i+1,2*i+2
由于我将进行从小到大的排序,因此我将使用的是大根堆。
此处我所将要进行的堆排序思路大致如下:
1)假设待排序数据元素有n个,那么我们就从n/2-1下标处开始倒着进行进行调整
2)当我们进行了n/2logn次调整之后,此时最大的值就在堆顶,交换堆顶数据和n-1处的数据,此时最大的数值就在数组的末尾了。
3)至此,我们已经大致上建立了一个大根堆,但是仍需进一步调整。由于n-1下标处已经是最大,这下我们从下标为0开始调整,直到n-2处,每调整一次则交换一次。
代码如下:
void Show_arr(int *arr, int n){ for (int i = 0; i<n; i++) { printf("%d ", arr[i]); } printf("\n");}void swap(int *x, int *y){ int tmp; tmp = *x; *x = *y; *y = tmp;}void Heap_Adjust(int *arr, int start, int end){ int tmp = arr[start]; int i = 2 * start + 1; while (i <= end) { if (arr[i] < arr[i + 1] && i + 1 <= end) { i++; } if (arr[i] > tmp) { arr[start] = arr[i]; } else { break; } start = i; i = 2 * start + 1; } arr[start] = tmp;}void HeapSort(int *arr, int n){ //建立堆(大根堆)n/2*logN for (int i = n / 2 - 1; i >= 0; --i) { Heap_Adjust(arr, i, n - 1); } swap(&arr[0], &arr[n - 1]); //调整堆 n*logN for (int j = n - 2; j>0; --j) { Heap_Adjust(arr, 0, j); swap(&arr[0], &arr[j]); }}int main(){ int arr[] = { 16, 3, 6, 18, 2, 45, 4, 38, 2, 99, 34, 36, 27, 1 }; int n = sizeof(arr) / sizeof(arr[0]); HeapSort(arr, n); Show_arr(arr, n); return 0;}
运行结果如下:
0 0
- 堆及堆排序
- 堆/堆排序特点
- 【二叉堆、堆排序】
- 二叉堆 & 堆排序
- 二叉堆 & 堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆与堆排序
- 堆和堆排序
- 堆排序(最大堆)
- 堆和堆排序
- 堆和堆排序
- 堆及堆排序
- 堆和堆排序
- 堆与堆排序
- 基于SignalR的小型IM系统
- 实现多行多列的RadioButton同时自由调整每行显示数量和上下间距
- ORA-56705: I/O calibration already in progress的解决方法
- HTML 5 属性
- Cassandra 故障探测原理--Accrual Failure Detector
- 堆排序
- 虚拟机 Kali的网络连不上?
- 封装HTTPRequestSerializer 的知识(一)
- 关于HBase协处理器导致问题的研究
- 使用 AngularJS 的路由和模板实现单页应用 (Single Page)
- 多媒体应用练习---照相机开发
- 通过文件分类实现程序内敛
- 关于一些css属性在微信上不兼容的解决方法
- PLM系统与选择