数据结构排序-堆排序
2015-05-27 22:16
274 查看
堆排序就是利用了最大堆(或最小堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字变得简单。以最大堆为例,它的基本思想就是:
先将初始文件R[1..n]建成一个最大堆,此堆为初始的无序区;
再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R
交换,由此得到新的无序区R[1..n-1]和有序区R
,且满足R[1..n-1].keys≤R
.key;
由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n1..n].keys,同样要将R[1..n-2]调整为堆; 重复此操作直到全部有序。
下面是示例图:
先将初始文件R[1..n]建成一个最大堆,此堆为初始的无序区;
再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R
交换,由此得到新的无序区R[1..n-1]和有序区R
,且满足R[1..n-1].keys≤R
.key;
由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n1..n].keys,同样要将R[1..n-2]调整为堆; 重复此操作直到全部有序。
下面是示例图:
#include <stdio.h> #include <stdlib.h> int n; /* * 生成堆 */ void HeapAdjust(int *array, int s, int m) { int i; array[0] = array[s]; for (i = s * 2; i <= m; i *= 2) { if (i < m && array[i] < array[i + 1]) { i++; } if (!(array[0] < array[i])) { break; } array[s] = array[i]; s = i; } array[s] = array[0]; } /* * 堆排序 */ void HeapSort(int *array) { int i; for (i = n / 2; i > 0; i--) { HeapAdjust(array, i, n); } for (i = n; i > 1; i--) { array[0] = array[1]; array[1] = array[i]; array[i] = array[0]; HeapAdjust(array, 1, i - 1); } } int main() { int i; int *array; printf("请输入数组的大小:"); scanf("%d", &n); array = (int*) malloc(sizeof(int) * (n + 1)); printf("请输入数据(用空格分隔):"); for (i = 1; i <= n; i++) { scanf("%d", &array[i]); } HeapSort(array); printf("排序后为:"); for (i = 1; i <= n; i++) { printf("%d ", array[i]); } printf("\n"); }
相关文章推荐
- 【数据结构】将一组数据升序排序(利用堆排序)
- 数据结构学习笔记 --- 排序(选择排序、堆排序)
- 堆排序--数据结构排序1
- 要开始准备找工作了,昨天闲时就自己写了个数据结构排序类,包括了堆排序,归并排序,速度排序,插入排序。
- 数据结构:排序算法之堆排序和选择排序
- 【数据结构练习】排序——堆排序和快排
- 数据结构&算法实践—【排序|选择排序】堆排序
- 数据结构-排序-堆排序
- 数据结构 排序(堆排序)
- 【数据结构_1015_堆排序】一趟堆排序后的结果
- 图解"数据结构--内部排序算法"----选择排序:直接选择排序、堆排序
- 数据结构-排序-堆排序
- 算法和数据结构---排序---堆排序
- 数据结构--各种排序的实现(排序小结 希尔排序 快排 堆排序 归并排序)
- 数据结构学习笔记 --- 排序(选择排序、堆排序)
- 【数据结构】常用比较排序算法(包括:选择排序,堆排序,冒泡排序,选择排序,快速排序,归并排序)
- 数据结构_内部排序_希尔排序_快速排序_堆排序_归并排序_地址排序
- 数据结构例程——选择排序之堆排序
- c++实现数据结构中的各种排序方法:直接插入、选择,归并、冒泡、快速、堆排序、shell排序
- 数据结构和算法分析之排序算法--选择排序(堆排序)