1.
堆和二叉排序树的区别:
在数据结构方面,堆是一种完全二叉树,有最大堆和最小堆两种,最大堆要求父节点的
值大于等于其两个子节点的值,最小堆要求父节点的值小于等于其子节点的值。二叉排序树
是一种二叉树,每个节点的值大于左子树中所有节点的值,小于右子树中所有节点的值。
在排序方面,堆只保证堆顶事最大或最小元素,堆不一定是有序的,而二叉排序树的中
序遍历序列是一个有序序列。
2.
最好采用堆排序的方法,先把整个序列放到一个数组中,表示成完全二叉树,之后建立
成最小堆,每次取走堆顶元素,再整理堆,只需要 k 次即可得到第 k 个最小元素之前的部分
排序序列,构建堆的时间复杂度为 O(n),经过 k 次整理,每次整理堆的时间复杂度为
O(logn),故总时间开销为 O(n)+k*O(logn)。
3.
算法基本思想为把最小的 个元素放在 A 中,而其余的元素放在 B 中。
基于枢轴来将 n 个整数划分为两个子集
若 i= ,则分组完成,算法结束
若 i< ,则枢轴之前的元素均属于 A,继续对 i 之后的元素进行划分
若 i> ,则枢轴之后的元素均属于 A,继续对 i 之前的元素进行划分
算法时间复杂度为 O(n),空间复杂度为 O(1)。
代码如下:
int SetPartition(int a[], int n)
{
int pivotkey, i;
int low = 0, low1 = 0;
int high = n - 1, high1 = n - 1;
int flag = 1;
int k = n / 2;
int s1 = 0, s2 = 0;
while (flag)
{
pivotkey = a[low];
while (low < high)
{
while (low < high && a[high] >= pivotkey)
high--;
if (low != high)
a[low] = a[high];
while (low < high && a[low] <= pivotkey)