堆排序(heap sort)

news/2024/5/19 5:47:34 标签: 堆排序, heap, c语言

核心思想: 使用最大堆,每次从堆顶取出当前最大元素,并与堆末尾元素替换,并且把当前堆大小减少1,进行n-1次后 排序完成。

时间复杂度: o(NlogN)


核心代码:

//如果数组从0开始则取不到size 下面的 child != size-1 (关键) 若写成child != size 则越界
//如果数组从1开始存数据 则要取到size 下面相应写成child != size

void adjust_heap(Heap *h, int i, int size)
	{
		int child, parent;
		int tmp = h->data[i];  //整个过程就是下滤操作 不断调整堆
		for(parent = i; parent*2 + 1 < size; parent = child){ 
			child = parent*2+1;
			if(child != size-1 && h->data[child] < h->data[child+1])
				child++;
			if(h->data[child] > tmp){
				h->data[parent] = h->data[child];	
			}
			else
				break;	
		} 
		h->data[parent] = tmp;
	}
	
void heap_sort(Heap *h, int n)
	{
		int i;
		for(i = n/2-1; i >= 0; i--){ //i的初始值与数组存元素的开始索引有关 (调整为最大堆的过程)
			adjust_heap(h, i, n);
		}
		for(i = n-1; i > 0; i--){ //最后剩下的一个是最小的元素 
			swap(&h->data[0], &h->data[i]);
			adjust_heap(h, 0, i);
		}
		printf("排序后:\n");
		for(i = 0; i < h->size; i++ ){
			printf("%d ",h->data[i]);
		}
	}

完整实现:

#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct HeapNode{
	int size;
	int data[MAX];
}Heap;
void init_heap(Heap *h)
	{
		h->size = 0;
	}
void build_heap(Heap *h)
	{
		int n;
		scanf("%d",&n);
		h->size = n;
		int i;
		printf("排序前:\n");
		for(i = 0; i < n; i++ ){
			scanf("%d",&h->data[i]);
		}	

	}	
void swap(int *a, int *b)
	{
		int temp;
		temp = *a;
		*a = *b; 
		*b = temp;	
	}	
void adjust_heap(Heap *h, int i, int size)
	{
		int child, parent;
		int tmp = h->data[i];
		for(parent = i; parent*2 + 1 < size; parent = child){ 
			child = parent*2+1;
			if(child != size-1 && h->data[child] < h->data[child+1])
				child++;
			if(h->data[child] > tmp){
				h->data[parent] = h->data[child];	
			}
			else
				break;	
		} 
		h->data[parent] = tmp;
	}
	
void heap_sort(Heap *h, int n)
	{
		int i;
		for(i = n/2-1; i >= 0; i--){ //i的初始值与数组存元素的开始索引有关 
			adjust_heap(h, i, n);
		}
		for(i = n-1; i > 0; i--){ //最后剩下的一个是最小的元素 
			swap(&h->data[0], &h->data[i]);
			adjust_heap(h, 0, i);
		}
		printf("排序后:\n");
		for(i = 0; i < h->size; i++ ){
			printf("%d ",h->data[i]);
		}
	}
int main()
	{
		int i;
		Heap h;
		init_heap(&h);
		build_heap(&h);
		heap_sort(&h,h.size);

		return 0;	
	} 






http://www.niftyadmin.cn/n/788215.html

相关文章

如何收集SparkSteaming运行日志实时进入kafka中

用过sparkstreaming的人都知道&#xff0c;当使用sparkstreaming on yarn模式的时候&#xff0c;如果我们想查看系统运行的log&#xff0c;是没法直接看的&#xff0c;就算能看也只是一部分。 这里的log分&#xff1a; &#xff08;1&#xff09;spark本身运行的log &#xff0…

Python错误集锦:pandas读取excel提示ImportError: Missing optional dependency ‘xlrd’.

原文链接&#xff1a;http://www.juzicode.com/archives/3125 错误提示&#xff1a; 用pandas read_excel()方法读取xls或xlsx文件时&#xff0c;提示&#xff1a;ImportError: Missing optional dependency ‘xlrd’. Install xlrd > 1.0.0 for Excel support Use pip or …

归并排序(递归版本)C实现~

归并原理&#xff1a;第一步&#xff1a;申请空间&#xff0c;使其大小为两个已经排序序列之和&#xff0c;该空间用来存放合并后的序列第二步&#xff1a;设定两个指针&#xff0c;最初位置分别为两个已经排序序列的起始位置第三步&#xff1a;比较两个指针所指向的元素&#…

jquery上传插件uploadify 报错http error 302 解决方法之一

前段时间用到jquery上传插件uploadify时&#xff0c;始终出现系统报出 http error 302 的错误。 网上大量搜集信息&#xff0c;基本上都是说session值丢失的问题&#xff0c;根据网友提供的解决方案进行修改&#xff0c;问题并没有解决。 因此&#xff0c;不排除这是解决302错误…

Flutter移动应用开发实战——异常

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

Python错误集锦:在pandas中用to_excel()写文件提示:ModuleNotFoundError: No module named ‘xlwt’

原文链接&#xff1a;http://www.juzicode.com/archives/3127 错误提示&#xff1a; 在pandas中用to_excel()写文件提示&#xff1a;ModuleNotFoundError: No module named ‘xlwt’&#xff1a; import numpy as np import pandas as pd arr np.random.randint(-50,50,size…

归并排序 (非递归版本) C实现~

非递归版的归并排序&#xff0c;省略了中间的栈空间&#xff0c;直接申请一段O(n)的地址空间即可&#xff0c;因此空间复杂度为O(n),时间复杂度为O(nlogn); 实现&#xff1a; #include<stdio.h> #include<stdlib.h>void merge1(int a[], int tmp[], int left, int…

如何收集项目日志统一发送到kafka中?

[img]https://img-blog.csdn.net/20170207190128849[/img] 上一篇&#xff08;[url]http://qindongliang.iteye.com/blog/2354381[/url] &#xff09;写了收集sparkstreaming的日志进入kafka便于后续收集到es中快速统计分析&#xff0c;今天就再写一篇如何在普通应用程序实时收…