堆排序(C语言)

  1. #ifndef HEAP_SORT_H
  2. #define HEAP_SROT_H
  3. #include<iostream>
  4. void maxHeap(int *arr,unsigned int Length);
  5. void maxHeap(int *arr,unsigned int rootIndex,unsigned int heapSize);
  6. void builMaxHeap( int *arr,unsigned int heapSize);
  7. inline unsigned int right(unsigned int index);
  8. inline unsigned int left(unsigned int index);
  9. void heapSort(int *arr,int Length);
  10. inline unsigned int left(unsigned int index){
  11. return 2*index+1;
  12. }
  13. inline unsigned int right(unsigned int index){
  14. return 2*index+2;
  15. }
  16. void maxHeap(int *arr,unsigned int rootIndex,unsigned int heapSize){
  17. unsigned int leftIndex=left(rootIndex);
  18. unsigned int rightIndex=right(rootIndex);
  19. unsigned int largest;
  20. if(arr[leftIndex]>arr[rootIndex]&&leftIndex<heapSize){
  21. largest=leftIndex;
  22. }else{
  23. largest=rootIndex;
  24. }
  25. if(arr[rightIndex]>arr[largest]&&rightIndex<heapSize){
  26. largest=rightIndex;
  27. }
  28. if(largest!=rootIndex){
  29. int temp=arr[largest];
  30. arr[largest]=arr[rootIndex];
  31. arr[rootIndex]=temp;
  32. maxHeap(arr,largest,heapSize);
  33. }
  34. }
  35. void builMaxHeap( int *arr,unsigned int heapSize){
  36. for(int i=heapSize/2-1; i>=0;--i){
  37. maxHeap(arr,i,heapSize);
  38. }
  39. }
  40. void heapSort(int *arr,int Length){
  41. for(int size=Length-1;size>0;size--){
  42. builMaxHeap(arr,size);
  43. int temp=arr[size];
  44. arr[size]=arr[0];
  45. arr[0]=temp;
  46. }
  47. }
  48. #endif

来自为知笔记(Wiz)

时间: 2024-10-06 05:52:00

堆排序(C语言)的相关文章

堆排序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> typedef int ElementType; int arr1[11]={0,2,87,39,49,34,62,53,6,44,98}; void Swap(int* a,int* b) { int temp=*a; *a=*b; *b=temp; } void PercDown(int A[], int i, int N) { int child; ElementType Tmp; for (Tmp = A[i]; 2*i+1 < N;

堆排序C语言版本的

// 2016_2_25_heap.cpp : Defines the entry point for the console application.// #include "stdafx.h" //调整树堆,使最大值放在根节点//i是数组元素位置,也是树的//长度void HeapAdjust(int array[],int i,int nLength)//这个只做一次{ int nChild;//这个是i对应的子节点 int nTemp; for(;2*i+1<nLengt

数据结构:堆排序

「仅为草稿,尚未详解」 堆排序(C语言版) 走进堆排序 什么是堆 堆实质就是一颗完全二叉树,其任何一非叶子节点满足下列性质. i=1,2,3...n/2 说明: 既然是完全二叉树,我们就可以用数组来表示! 堆根据上面的性质又分为: 从中不难发现,大顶堆从上往下依次键值减小,小顶堆从上向下键值增大. 什么是堆排序 ? 对一组待排序记录的关键字,首先把它们按堆的定义建成小(大)顶堆 ? 然后输出堆顶的最小(大)关键字所代表的记录,再对剩余的关键字建堆,以便得到次小(大)的关键字 ? 如此反复进行,直

快速排序,归并排序,堆排序python实现

快速排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n^2),平均情况下为O(n*logn),是不稳定的排序 归并排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是稳定的排序 堆排序的时间复杂度最好情况下为O(n*logn),最坏情况下为O(n*logn),平均情况下为O(n*logn),是不稳定的排序 1.快速排序 快速排序的介绍以及C语言实现在这里:快速排序C语言实现 本文介绍的是快速排序python实现: de

常见的9种内部排序(C语言实现)

现在已经把常见的9种内部排序算法都用C语言实现了,为了方便自己和大家查看,就弄了这么一个类似于导航目录的东西. 一.冒泡排序 冒泡排序(C语言版) 二.选择排序 选择排序(C语言版) 三.直接插入排序 直接插入排序(C语言版) 四.希尔排序 希尔排序(C语言版) 五.归并排序 归并排序(C语言版) 六.基数排序 基数排序(C语言版) 七.快速排序 快速排序(C语言版) 八.计数排序 计数排序(C语言版) 九.堆排序 堆排序(C语言版) 介绍完这九个常用的排序算法,怎么能没有一个比较呢?下面是我对

C++STL容器简析

标准STL序列容器:vector.string.deque和list.标准STL关联容器:set.multiset.map和multimap.非标准的关联容器hash_set.hase_multiset.hash_map和hash_multimap. (1)vector容器vector的数据安排以及操作方式,与array非常相似.两者的唯一区别在于空间的运用的灵活性.array是静态空间,一旦配置了就不能改变.vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素.因此,

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

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

对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)/

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

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