堆建立:
void heapbuild(int a[], int subroot_node, int alen ) // 输入为 待排序数组,子根节点:用于向下排查的子二叉树,长度
{
int temp = a[subroot_node];
int j;
for(j = 2*subroot_node + 1; j < alen; j = 2*j + 1)
{
if((j + 1) < alen && a[j] < a[j + 1]) // (j + 1) < alen是防止移到后面的大数,又来参加建堆
j++;
if(j < alen && temp >= a[j]) // 这里不能用(j + 1)< alen,因为只有两个结点的时候,条件不满足
break;
a[subroot_node] = a[j];
subroot_node = j; // 变成叶子节点
}
a[subroot_node] = temp;
}
堆排序:
void sortheap(int a[], int alen) // 输入为 待排序数组,长度
{
int i;
for(i = (alen - 1)/2; i >= 0; i--)
heapbuild(a, i, alen); // 建堆
for(i = alen - 1; i >= 0; i--)
{
SWAP(a[0], a[i]);
heapbuild(a, 0, i); // 每循环一次用于建堆的数组长度减1
}
}
//轴为数组中间元素
void quick_sort(int a[],int left, int right)
{
int s,i,j;
if(left < right)
{
s = a[(left + right)/2];
i = left - 1;
j = right + 1;
while(1)
{
// 从左向右找
while(i+1 < MAX && a[++i] < s);
// 从右向左找
while(j > 0 && a[--j] > s);
if(i >= j)
break;
SWAP(a[i], a[j]);
}
quick_sort(a, left, j);
quick_sort(a, j+1, right);
}
}