堆建立和堆排序,快速排序

堆建立:

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);
 }
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值