版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30648823/article/details/79764688
// 堆排序.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 100
typedef struct yuanShu {
char data; //数据
int weight; //权值
}YuanShu;
YuanShu arr[MAXSIZE]; //定义数组
int t = 0;
//初始化并构建为数组
void Init(int w,char d,int t) {
arr[t].data = d;
arr[t].weight = w;
}
//写入数据
void XieRu() {
int w;
char d;
printf("请输入权值 0结束\n");
scanf_s("%d", &w);
while (w) {
printf("请输入数据\n");
scanf_s(" %c", &d);
Init(w, d, t);//往数组里面写
printf("请输入权值 0结束\n");
scanf_s("%d", &w);
t++;
}
}
//输出输入的数据
void Prints() {
for (int i = 0; i < t; i++) {
printf("数据为%c 权值为%d \n", arr[i].data, arr[i].weight);
}
}
//堆排序开始
//落底
void DuiLuoDi(int n, int k) {
int k1 = 2 * k + 1;//左边
int k2 = 2 * k + 2;//右边
if (k1 >= n&&k2 >= n) {
return;
}//已经是叶子了
int a1 = _CRT_INT_MAX;
int a2 = _CRT_INT_MAX;
if (k1 < n) a1 = arr[k1].weight;//如果有左孩子那么赋值
if (k2 < n) a2 = arr[k2].weight;//如果有右边孩子那么赋值
if (arr[k].weight <= a1&&arr[k].weight <= a2) {
return;
}//落底完成
//否则找到最小的与之交换
if (a1 < a2) {
YuanShu t = arr[k];
arr[k] = arr[k1];
arr[k1] = t;
DuiLuoDi(n, k1);
}else {
YuanShu t = arr[k];
arr[k] = arr[k2];
arr[k2] = t;
DuiLuoDi(n, k2);
}
}
//完全排序加开始
void DuiInit() {
for (int i = t/2; i >= 0; i--) {
DuiLuoDi(t,i);
}
int n = t;//剩余元素
while (n>0) {
printf("元素为%c 权值为%d\n", arr[0].data, arr[0].weight);
arr[0] = arr[n - 1];
n--;
DuiLuoDi(n, 0);
}
}
//堆排序结束
//重新排序
void PaiXu() {
for (int i = t / 2; i >= 0; i--) {
DuiLuoDi(t, i);
}
}
//插入元素
void ChaRu(int a, char b) {
t++;
arr[t-1].data = b;
arr[t-1].weight = a;
PaiXu();
}
//弹出
void Out() {
PaiXu();
printf("元素为%c ---权值为%d\n", arr[0].data, arr[0].weight);
arr[0] = arr[t-1];
t--;
DuiLuoDi(t, 0);
}
int main()
{
XieRu();
Prints();
//排序
printf("下面是排序\n");
//DuiInit();//解除次注释可以完成全部的排序
//出来一个
Prints();
printf("\n----------------------\n\n\n");
Out();
for (int i = 0; i < t; i++) {
printf("\n%d\n", arr[i].weight);
}
//写入一个
ChaRu(10, 'c');
for (int i = 0; i < t; i++) {
printf("\n%d\n", arr[i].weight);
}
return 0;
}