您的位置:首页 > 其它

算法 —— 堆排序

2015-08-27 10:31 239 查看
堆排序与快速排序,归并排序都是时间复杂度为O(N*logN) 的排序方法。在学习堆排序之前,首先讲解一下数据结构当中的二叉堆。



图一

如图一所示,就是一个二叉堆。
二叉堆满足的特性为:
1、父节点的键值总是大于或等于(小于或等于)任何一个子节点的键值
2、每个节点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)

堆排序的原理:
1、将初始数列 根据二叉堆 的特性构建成大顶堆 (即 最大值 在 第 0 的位置上)
2、设定i = n (n 为初始数列的数据总数), 将 arr[0] 与 arr[i] 交换,则最大值排到了整个序列当中的最后位置
3、i = i -1,再将 0 ~ i 之间的数据重新按照二叉堆的特性排列,又形成大顶堆。
4、重复 2 、 3 步骤,直到 i = 1,则完成了相应的排序

代码:

void
heapSortSelector(int

arr[],int

n)

{

int
i;

for
(i = n /
2
-
1; i >=

0; i --) {

heapSortArray(arr, i, n);

}

for
(i = n -
1; i >

0; i --) {

int
temp = arr[i];

arr[i] = arr[0];

arr[0] = temp;

heapSortArray(arr,

0, i);

}

}

void

heapSortArray(int

arr[],int

i,int

n)

{

int
child,temp;

for
(temp = arr[i]; i *
2
+
1
< n ;i = child ) {

child =
2
* i +
1;

if
(child < n -
1
&& arr[child] < arr[child +
1]) {

child ++;

}

if
(arr[child] > temp) {

arr[i] = arr[child];

}

else

{

break;

}

}

arr[i] = temp;
}

详细可以 参考 /article/1349065.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: