//建堆
 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;
 }
 }