博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
堆排序(heap sort)
阅读量:4217 次
发布时间:2019-05-26

本文共 2033 字,大约阅读时间需要 6 分钟。

核心思想: 使用最大堆,每次从堆顶取出当前最大元素,并与堆末尾元素替换,并且把当前堆大小减少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
#include
#define MAX 100typedef 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://aximi.baihongyu.com/

你可能感兴趣的文章
自动驾驶汽车传感器数字孪生建模(二)
查看>>
车载数字孪生预期功能安全未知危害分析技术
查看>>
自动驾驶汽车以太网数字孪生建模(一)
查看>>
自动驾驶汽车以太网数字孪生建模(二)
查看>>
初识软件定义汽车
查看>>
科普 | 自动驾驶预期功能安全(二)
查看>>
轩辕实验室丨SAE J3061汽车信息安全标准解读
查看>>
轩辕实验室丨欧盟EVITA项目预研 第一章(一)
查看>>
轩辕实验室丨欧盟EVITA项目预研 第一章(二)
查看>>
轩辕实验室丨欧盟EVITA项目预研 第一章(三)
查看>>
专利 | 一种基于深度学习的车载CAN总线入侵检测方法
查看>>
VCU解决方案及核心L9788复杂驱动功能安全审计启动
查看>>
助力“探月工程”的单元测试工具可10倍提升测试效率
查看>>
构建实时数仓 - 当 TiDB 偶遇 Pravega
查看>>
TiDB 容器化部署面面观丨「能量钛」圆桌论坛回顾
查看>>
TiDB 在网易游戏的应用实践
查看>>
迁移实战:Discourse 从 PostgreSQL 到 MySQL 到 TiDB丨AskTUG 论坛背后的故事
查看>>
TiDB Operator 源码阅读 (四) 组件的控制循环
查看>>
TiDB 5.1 发版,打造更流畅的企业级数据库体验
查看>>
2020-11-04
查看>>