一.堆排序
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
大顶堆
小顶堆
二.堆排序的算法
将待排序的数设置为大顶堆,这时最大的数就是堆顶的根节点,再将它(最大数)移走(实质上是将最大数与堆末尾进行互换,此时堆末尾为最大值),然后将剩下的数列重新构成一个堆,反复这样操作过后就会得到有序的数列。
1.寻找最大数
如图所示,将最大的数90从根节点,放到堆的末尾,让最小的数放到根节点。
2. 寻找第二大数
三.程序代码
#include"duisort.h"
#define SIZE 10
int main()
{
int arr[SIZE];
produce_arr(arr,SIZE);
printf("befor\n");
show_arr(arr,SIZE);
heapsort(arr,SIZE);
printf("after\n");
show_arr(arr,SIZE);
return 0;
}
2. .c文件
#include"duisort.h"
void produce_arr(int *__src,int length)
{
srand(time(NULL));
for(int i = 0;i<length;i++)
__src[i] = rand()%100;
}
void show_arr(int *__src,int length)
{
for (int i = 0; i < length; i++)
{
printf("%d ",__src[i]);
}
printf("\n");
}
void swap(int *__src,int *__dest)
{
int temp = *__src;
*__src = *__dest;
*__dest = temp;
}
void heapadjust(int *__src,int length,int i)
{
int max = i;
int lchild = i*2+1;
int rchild = i*2+2;
if(lchild < length && __src[max] < __src[lchild])
max = lchild;
if (rchild < length && __src[max] < __src[rchild])
max = rchild;
if(max != i)
{
swap(&__src[max],&__src[i]);
heapadjust(__src,length,max);
}
}
void heapsort(int *__src,int length)
{
int i;
for(i=length/2-1;i>=0;i--)
heapadjust(__src,length,i);
for(i=length-1;i>0;i--)
{
swap(&__src[i],&__src[0]);
heapadjust(__src,i,0);
}
}
3. .h文件
#ifndef _DUISORT_H_
#define _DUISORT_H_
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void produce_arr(int *__src,int length);
void show_arr(int *__src,int length);
void swap(int *__src,int *__dest);
void heapadjust(int *__src,int length,int i);
void heapsort(int *__src,int length);
#endif
四.运行结果