1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void Swap(int arr[],int a,int b);
void HeapSort(int arr[],int length);
void adjustHeap(int arr[],int i,int length );
void PrintSort(int arr[]);
/**
* @brief Swap
* @param arr
*/
void Swap(int arr[],int a,int b)
{
int temp;
temp=arr[a];
arr[a]=arr[b];
arr[b]=temp;
}
/**
* @brief adjustHeap
* @param arr
* @param i
* @param length
*/
void adjustHeap(int arr[],int i,int length )
{
/*先取出当前的元素i,为爸爸 k为儿子*/
int temp=arr[i];
/*从第一个非叶子节点开始进行调整,从左到右,从下到上*/
for(int k=2*i+1;k<length;k=2*k+1){
if(k+1<length && arr[k]<arr[k+1]){
k++;
}
/*如果子节点大于父节点,就交换*/
if(arr[k]>temp){
arr[i]=arr[k];
i=k;
}else{
break;
}
}
arr[i]=temp;//将temp的值放最终的位置
}
/**
* @brief HeapSort
* @param arr
*/
void HeapSort(int arr[],int length)
{
//构建堆
/**从小到大进行排序使用大顶堆,反之使用小顶堆**/
for(int i=length/2-1;i>=0;i--){
/*从第一个非叶子节点从上到下,从右到左调整结构*/
adjustHeap(arr,i,length);
}
//调整堆结构+交换堆顶元素与末尾元素
for(int j=length-1;j>0;j--){
Swap(arr,0,j);
/*重新调整堆结构*/
adjustHeap(arr,0,j);
}
}
void PrintSort(int *arr)
{
for(int i=0;i<sizeof(arr)/sizeof(int);i++){
printf("%d\n",arr[i]);
}
}
int main(int argc, char *argv[])
{
int arr[] = {5,3,8,1,6};
int len = sizeof(arr) / sizeof(int);
printf("\n");
HeapSort(arr,len);
for(int i=0;i<len;i++){
printf("%d ",arr[i]);
}
}
2
#include <stdio.h>
#include <stdlib.h>
void swap(int *arr,int i, int k)
{
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
void max_heapify(int *arr, int start, int end)
{
//建立父节点下标和子节点下标
int dad = start;
int son = dad * 2 + 1;
while (son <= end)
{ //若子节点下标在范围内才做比较
if (son + 1 <= end && arr[son] < arr[son + 1]) //先比较两个子节点大小,选择最大的
{
son++;
}
if (arr[dad] > arr[son]) //如果父节点大于子节点代表调整完毕,直接跳出
{
return;
}
else
{ //否则交换父子节点的值再继续左右子节点值得比较
swap(arr,dad, son);
printf("dad=%d--son=%d\n",dad,son);
dad = son;
son = dad * 2 + 1;
}
}
}
void heap_sort(int *arr, int len)
{
int i;
//初始化,i从最后一个父节点开始调整
for (i = len / 2 - 1; i >= 0; i--)
{
max_heapify(arr, i, len - 1);
}
for (i = len - 1; i > 0; i--)
{
swap(arr,0, i);
max_heapify(arr, 0, i - 1);
}
}
int main(int argc, char const *argv[])
{
int arr[] = {1, 2, 3, 4,6,5, 7, 8, 9};
int len = sizeof(arr) / sizeof(int);
heap_sort(arr, len);
for (int i = 0; i < len; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}