堆排序:
时间复杂度:O(nlogn)
稳定性:不稳定
实现原理:将待排序的序列构造成一个大顶堆(或小顶堆) 整个序列的最大值就是堆顶的根节点,将它移走 (就是将其与对数组的末尾元素交换,此时末尾元素就是最大值)。然后将剩余的n-1个序列重新
构成一个堆,这样就会的到n个元素中 的最大值如此反复执行,得到一个有序序列。
大顶堆:根节点是最大者
小顶堆:根节点是最小者
大顶堆满足条件:K[i]>=K[2*i+1] 且K[i]>=K[2*i+2] (0<=i<=n/2-1) K[i]为堆顶 K[2*i+1]为堆顶左子树 K[2*i+2]为堆顶的右子树
小顶堆满足条件:K[i]<=K[2*i+1] 且K[i]<=K[2*i+2] (0<=i<=n/2-1)
实现步骤:
1.先将初始文件R[1..n]建成一个大顶堆,此堆为初始的无序区
2. 再将关键字最大的记录R1和无序区的最后一个记录R[n]交换,
3. 由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
4. 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。
5.然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,
6.由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n- 2].keys≤R[n-1..n].keys,
7.同样要将R[1..
数据结构之堆排序C语言实现
最新推荐文章于 2023-12-11 19:34:12 发布