堆排序(C语言)

#include <stdio.h>
#include <stdlib.h>
void HeapAdjust(int a[], int i, int length)   //这个函数用来形成大根堆
{
 int child;
 int temp;
 for (; 2 * i + 1 < length; i = child)
    {
      child = 2 * i + 1;
      if (child < length - 1 && a[child + 1] > a[child])   
         {
           ++child;
         }
      if (a[i] < a[child])
	 {
	   temp = a[i];
	   a[i] = a[child];
	   a[child] = temp;
	 }
      else
        {  
         break;   
        }
   }
}
void HeapSort(int a[], int length)
{
 int i;
 for (i = length / 2 - 1; i >= 0; --i)   //此for是对堆进行排序,循环完毕后第一次形成一个大根堆
    {
       HeapAdjust(a, i, length);    
    }
 for (i = length - 1; i > 0; --i)  // 这个for用来取根堆顶端最大值。i从末尾元素开始,直到正数第二个元素,第一个元素不用交换
    {
     //异或运算的操作,不用中间变量实现两数交换
	  a[i] = a[0] ^ a[i];
	  a[0] = a[0] ^ a[i];
	  a[i] = a[0] ^ a[i];
	  HeapAdjust(a, 0, i);       //上一个for循环实现一个大根堆,最顶端元素a[0]最大,在进行这个for循环时,将最顶端的最大值与数组末尾进行交换后,最顶端不再是最大值,调用HeapAdjus函数再次调整成一个大根堆,再取顶端最大值存放 
    }
}
void main()
{
 int i;
 int num[] = { 45, 9, 78, 23, 65, 85, 0, 21, 32 };
 printf("\n排序前:\n");
 for (i = 0; i < sizeof(num) / sizeof(int); i++)
    {
      printf("%4d", num[i]);
    }
 HeapSort(num, sizeof(num) / sizeof(int));
 printf("\n排序后:\n");
 for (i = 0; i < sizeof(num) / sizeof(int); i++)
    {
      printf("%4d", num[i]);
    }
 printf("\n");
 system("pause");
}


在这里插入图片描述
执行后,每个村上下有序,但彼此之间无序。

在这里插入图片描述
村比较完,比较镇
在这里插入图片描述
在这里插入图片描述
此时镇上下有序,但彼此无序
再继续 i–,此时i=0

在这里插入图片描述第一次形成一个大根堆,第一次实现一个有序的“区”,执行完HeapSort函数中的第一个for循环。开始执行第二个for循环,即取数并存放
a[0]和a[i]交换,此时i=length-1
在这里插入图片描述

在这里插入图片描述
交换完后,最大值被存储在a[length-1],但除了它以外,上面又变成一个无序的“区”了,所以再次调用HeapAdjust函数,使其成为一个有序的“区”,使顶端再次出现最大值,再将这个最大值与length-2交换,循环操作,存一个数,调一次“区”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值