C语言 最大堆排序

#include<iostream>
using namespace std;

int left(int i){
	return 2*i;
}
int right(int i){
	return 2*i+1;
}
int parent(int i){
	return i/2;
}
void maxHeapify(int *arr, int length, int i){
	if(arr == 0 || i < 0){
		return ;
	}
	int l = left(i);
	int r = right(i);
	int largest = i;
	if(l < length && arr[l] > arr[largest]){
		largest = l;
	}
	if(r < length && arr[r] > arr[largest]){
		largest = r;
	}
	if(largest != i){
		int temp = arr[i];
		arr[i] = arr[largest];
		arr[largest] = temp;
		maxHeapify(arr, length, largest);
	}
}
void buildMaxHeap(int *arr, int length){
	if(arr == 0 || length <= 0){
		return;
	}
	for(int i=length/2-1; i>=0; i--){
		maxHeapify(arr, length, i);
	}
}
void maxHeapSort(int *arr, int length){
	if(arr == 0 || length <= 0){
		return;
	}
	int temp;
	for(int i=length; i>1; i--){
		temp = arr[i-1];
		arr[i-1] = arr[0];
		arr[0] = temp;
		buildMaxHeap(arr, i-1);
	}
}

int main(){
	int arr[7] = {2, 3, 5, 1, 8, 6, 4};
	maxHeapSort(arr, 7);
	for(int i=0; i<7; i++){
		printf("%d\n", arr[i]);
	}
	return 0;
}

时间: 2024-11-06 04:50:36

C语言 最大堆排序的相关文章

Go语言用堆排序的方法进行一千万个int随机数排序.

上篇文章用的是quicksort方法排序,但是如果用快速排序法对重复率很高的slice排序的时候,时间复杂度会激增,速度相当慢 所以尝试了一下堆排序,实验结果,感觉挺好的.下面是代码,大家可以参考一下,这个是建立的大顶堆. 二叉树的特性: 最后一个非叶子节点 : root = length/2(当length为奇数的时候root向下取整) 在GO语言中的索引位置:root - 1, 左右孩子节点:child_l = 2*root,索引位置:child_l-1,右孩子的节点: 2*root+1 索

数据结构之---C语言实现堆排序

过程图如下:(先建堆,在调整,插入,输出)   代码: //堆排序(HeapSort) //杨鑫 #include <stdio.h> #include <stdlib.h> //堆调整,构建大顶堆,arr[]是待调整的数组,i是待调整的数组 //元素的位置,length是数组的长度 void HeapAdjust(int arr[], int i, int length) { int Child; int temp; for(;2 * i + 1 < length; i =

java语言实现堆排序

package secondChapter; import java.util.Random; public class HeapSort { private static int AHeapSize; public static void main(String[] args) { HeapSort hs = new HeapSort(); int[] A = new int[10]; //产生随机数组 for(int i=0;i<A.length;i++){ A[i] = hs.genera

[算法学习笔记]排序算法——堆排序

堆排序 堆排序(heapsort)也是一种相对高效的排序方法,堆排序的时间复杂度为O(n lgn),同时堆排序使用了一种名为堆的数据结构进行管理. 二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子树和右子树都是一个二叉堆. 如上图显示,(a)是一个二叉堆(最大堆), (b)是这个二叉堆在数组中的存储形式. 通过给个一个节点的下标i, 很容易计算出其父节点,左右子节点的的下标,为了方便,

堆排序(Heap Sort)的C语言实现

堆排序(Heap Sort)具体步骤为 将无序序列建成大顶堆(小顶堆):从最后一个非叶子节点开始通过堆调整HeapAdjust()变成小顶堆或大顶堆 将顶部元素与堆尾数组交换,此是末尾元素就是最大值,顶部元素不满足堆,故要将顶部元素在剩余的i-1个元素中调整为堆 反复第2步.直至所有顶点被输出,序列变成从小到大的有序序列 C语言实现(编译器Dev-c++5.4.0,源代码后缀.cpp) 原创文章,转载请注明来自钢铁侠Mac博客http://www.cnblogs.com/gangtiexia 1

堆排序C语言实现

堆排序可以作为实时排序,是原址排序,不需要额外的空间,时间复杂度是O(nlgn),最好最坏平均情况都是这个,但是是不稳定排序,下面是C语言实现的代码.. //为了简化编程,堆数组元素中的第一个位置不使用. struct heap { int size; int *arr; } h; void max_heapify(struct heap * h, int p) { int largest; int hsize = h->size; int left = p * 2; int right = p

对c语言系统库函数、堆排序、希尔排序、折半插入排序、快速排序消耗时间的比较

#include <stdio.h> #include <time.h> #define N 100000 /*库比较函数:qsort(int *base,int n,int struct_size,int (*compare)(const void *,const void *))中的比较函数*/ int compare(const void *first, const void *second) { if (*(int *)first > *(int *)second)/

堆排序算法及C语言实现

堆排序算法的时间复杂度是O(nlgn),比插入排序要好,跟归并排序相同,但是与归并排序不一样的地方在于,堆排序不需要额外的存储空间,或者说,只需要常数个额外的存储空间,属于内排序算法. 有关插入排序和归并排序,请参照: 插入排序及C语言实现,归并排序及C语言实现. 原理是构造最大堆,并将根节点(最大值)放到数组有效最后位,直到堆节点数量为1. #include <stdio.h> int parent(int i); int left(int i); int right(int i); voi

堆排序(原理和C语言实现)

HeapSort 原理: (堆排序是不稳定的) 实现堆排序可以看成分为两个部分: 1.从一个无序堆建成一个大顶堆(假设我们要求从小到大排序) 2.在“输出”堆顶元素之后,调整剩余元素成为一个新的堆 建立大顶堆方法: 从最后一个非叶子结点开始向前遍历,每一个遍历到的结点都和它的两个(或者一个)子结点中的最大值比较,如果父结点小于孩子结点的较大值,就交换它们; 这样就可以保证每一个遍历到的结点都是以它为树顶的子树中的最大值,那么遍历完成后堆顶就是整个堆的最大值并且每个子树都是父结点大于孩子结点(相对