C语言实现堆排序

本文详细介绍了在C语言中使用堆排序算法对整数数组进行排序的过程,包括sift函数的实现和整个heap_sort函数的工作原理。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#include <stdlib.h>
//堆排(
void sift(int *nums,int low,int high){
    int i = low;
    int j = 2*i+1;//j是i位置的左孩子
    int temp = nums[low];
   
    while (j <= high)
    {
        if((j+1) <= high && nums[j+1] >nums[j]){//如果右孩子有且比较大,作用是选孩子
            j = j+1;//j指向右孩子
        }
        if(nums[j] >temp){//如果右孩子比当前节点还大,就将右孩子放在该节点上,找到上去的值
            nums[i] = nums[j];
            i = j;
            j = 2*i+1;
        }
        else{//tmp更大,把tmp放到i的位置上
            // nums[i] = temp;//这里的else与循环结束的nums[i] = temp;,都是会执行,所以之间放在while外去执行,
            //temp的位置取决于是否执行第二个if
            break; }   
    }
    nums[i] = temp;//把temp的值放在空位上
    
}

int *heap_sort(int *nums,int numsSize){
    //从(n-2)//2位置倒着遍历到0  从最下层的根节点开始,所以就是比如10个元素,4层,最下层的叶子节点(根节点)就是第三层,从下层开始有序
    for(int i = (numsSize-2)/2;i>=0;i--){
       
        sift(nums,i,numsSize-1);
    }//建堆完毕


    // 从每一个堆开始调整,每次将根拿掉,然后将最后一个叶子节点换上去,进行建堆
    //这个循环就是将最大的一个根拿下来,把小的换上去,进行建堆,使用前i个,这样末尾的numsSize-i个已经有序
    for(int i= numsSize-1;i>=0;i--){
        int temp = nums[0];
        nums[0] = nums[i];
        nums[i] = temp;
        sift(nums,0,i-1);
    }
    return nums;
}

int main(int argc, char const *argv[]){
	int arr8[10] = {10,19,1,7,6,5,24,30,2,8};
    int arr8Size = (sizeof(arr8)/sizeof(arr8[0]));
    printf("arr8Size = %d\n",arr8Size);
   
    int *re8 = heap_sort(arr8,arr8Size);
    printf("堆排序:");
    for(int i = 0;i<10;i++){
        printf("%d ",re8[i]);
    }
    printf("\n");
	return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值