频道栏目
首页 > 程序开发 > 软件开发 > C语言 > 正文
编程开发堆排序问题C语言版
2018-06-26 10:54:58      个评论    来源:ox0080的博客  
收藏   我要投稿
AfxStd.h
世界杯投注官网pragma once
世界杯投注官网ifndef AFXSTD_H
世界杯投注官网define AFXSTD_H
世界杯投注官网include
世界杯投注官网include
世界杯投注官网include
世界杯投注官网endif // !AFXSTD_H
heap.h
世界杯投注官网pragma once
世界杯投注官网include"AfxStd.h"
世界杯投注官网ifndef HEAP_H
世界杯投注官网define HEAP_H
void HeapSort(int *arr, int length);
void MeakHeap(int *arr, int length);
void AdjustHeap_Down(int *arr, int start, int end);
void AdjustHeap_Up(int *arr, int start);
void swap(int *arr, int a, int b);
世界杯投注官网endif // !HEAP_H
heap.cpp
世界杯投注官网include"heap.h"
void MeakHeap(int *arr, int length)
{
	if (arr == NULL)
	{
		return;
	}
	for (int i = (length -1)/2; i >= 0; i--)/*从第一个非叶子节点从下至上,从右至左调整结构*/
	{
		AdjustHeap_Down(arr, i, length - 1);  /*调整函数中传入了数组,起始坐标,末尾坐标*/
	}
}
void HeapSort(int *arr,int length) /*排序函数中是传入了数组的长度length*/
{
	if (arr==NULL)
	{
		return;
	 }
	for (int i=(length-1)/2;i>=0;i--)
	{
		/*从第一个非叶子节点从下至上,从右至左调整结构*/
		AdjustHeap_Down(arr,i,length-1);  /*调整函数中传入了数组,起始坐标,末尾坐标*/
	}
	/*调整堆结构,交换顶端元素与末端元素*/
	for (int j=length-1;j>0;j--)
	{
		swap(arr,0,j);
		AdjustHeap_Down(arr,0,j-1);
	}
}
void swap(int *arr, int a, int b)
{
	int temp = arr[a];
	arr[a] = arr[b];
	arr[b] = temp;
}
//AdjustHeap_Down,向下调整函数.作用是将数组转化为逻辑上的大堆,
//从而方便升序排序,如果要降序排序,该制堆函数将数组转化为小堆即可.
void AdjustHeap_Down(int *arr, int start, int end)
{
	int i = start;
	int j = 2 * i + 1;
	int temp = arr[i];
	while (j <= end)
	{
		if (j + 1 <= end && arr[j]temp)
		{
			arr[i] = arr[j];
			i = j;
			j = 2 * i + 1;
		}
		else
		{
			break;
		}
	}
	arr[i] = temp;
}
//Up,向下调整函数.作用是向上回溯使其符合小堆,也可稍作修使其符合大堆.
void AdjustHeap_Up(int *arr, int start)
{
	int i = start;
	int j = (start-1)/2;
	int temp = arr[i];
	while (j >=0)
	{
		if (arr[j]>temp)
		{
			arr[i] = arr[j];
			i = j;
			j = (j - 1) / 2;
		}
		else
		{
			break;
		}
	}
	arr[i] = temp;
}
main.cpp
世界杯投注官网include"PerioryQueue.h"
int main()
{
	int  arr[] = { 8,18,12,34,90,56,45,78 };
	for (int i = 0; i<8; i++)
	{
		printf("%d\t", arr[i]);
	}
	HeapSort(arr, sizeof(arr) / sizeof(arr[0]));
	printf("\n");
	for (int i = 0; i<8; i++)
	{
		printf("%d\t", arr[i]);
	}
	return 0;
}
点击复制链接 与好友分享!回本站首页
上一篇:数组名、数组地址、数组首字节地址之间的关系
下一篇:C语言函数调用栈的详细教程
相关文章
图文推荐

关于我们 | 联系我们 | 服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑--致力于做实用的IT技术学习网站

世界杯投注官网