您的位置:首页 > 其它

堆排序

2015-08-31 21:18 169 查看
一、概念
堆排序是利用堆这种数据结构的性质设计的一种排序方式。
堆是一个近似完全二叉树的结构,并满足性质:子节点的键值或则索引值总是小于等于(或则大于等于)父节点的。
是不稳定排序。

二、原理
1.首先将待排序的数组进行堆化,构建成堆结构
2.将堆首和堆尾进行交换
3.将堆大小减一,并调整剩下的数据,将数组顶端数据调整到合适的位置,保证依然保证是堆的结构
4.重复2、3,直到大小为1,此时数据已经有序
三、复杂度
时间复杂度:O(nlog(n))
空间复杂度:O(1)
四、原理图



五、代码实现

//从root位置开始向下调整,数组长度为size
void heap_adjust(int arr[], int root, int size)
{
int left_child;
int key;

key = arr[root];
left_child = 2 * root + 1;
while (left_child < size) {
if ((left_child + 1 < size) && (arr[left_child + 1] > arr[left_child])) {
left_child++;
}
if (arr[left_child] <= key) {
break;
}
arr[root] = arr[left_child];
root = left_child;
left_child = 2 * root + 1;
}
arr[root] = key;
}

//将待排序数组进行堆化
void build_heap(int arr[], int size)
{
int index;

for (index = size / 2; index >= 0; index--) {
heap_adjust(arr, index, size);
}
}

//用于交换两个数(用异或只适用整数)
void swap(int *x, int *y)
{
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}

//堆排序主函数
void heap_sort(int arr[], int size)
{
int index;

build_heap(arr, size);

for (index = size - 1; index >= 1; index--) {
swap(&arr[0], &arr[index]);
heap_adjust(arr, 0, index);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: