堆排序——c

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}


猜你喜欢

转载自blog.csdn.net/qq_30648823/article/details/79764688
今日推荐