//建堆
void AdjustDwon(int a[], int n, int i)
{
int root = i;
//默认满足条件的是左孩子
int child = root * 2 + 1;
while (child < n)
{
//如果右孩子更符合条件,就改
if (child+1<n&&a[child + 1] > a[child])
{
child += 1;
}
if (a[child] > a[root])
{
Swap(&a[child], &a[root]);
root = child;
child = root * 2 + 1;
}
else
{
break;
}
}
}
//堆排序
void HeapSort(int a[], int n)
{
int i = 0;
for(i = (n-1-1) / 2; i >= 0; i–)
{
//一次建堆
AdjustDwon(a, n, i);
}
//建大堆排升序,让数组第一个元素和最后一个与元素交换
int tmp = n - 1;
while (tmp > 0)
{
Swap(&a[0], &a[tmp]);
AdjustDwon(a, tmp, 0);
tmp–;
}
}
//三数取中
int san(int a[], int left, int right)
{
int mid = (left + right) / 2;
if (a[left] > a[right])
{
if (a[mid] > a[right])
return left;
else if (a[mid] > a[right])
return mid;
else
return right;
}
if (a[left] > a[mid])
{
if (a[right] > a[left])
return left;
else if (a[right] > a[mid])
return right;
else
return mid;
}
if (a[mid] > a[right])
{
if (a[left] > a[mid])
return mid;
else if (a[left] > a[right])
return left;
else
return right;
}
}