激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C語言 深入解讀數據結構之堆的實現

C語言 深入解讀數據結構之堆的實現

2022-02-21 15:10loveandsharef C/C++

堆就是用數組實現的二叉樹,所以它沒有使用父指針或者子指針。堆根據“堆屬性”來排序,“堆屬性”決定了樹中節點的位置

堆的概念與結構

概念:如果有一個關鍵碼的集合K={ k0,k1 ,k2 ,…,kn-1 },把它的所有元素按完全二叉樹的順序存儲方式存儲 在一個一維數組中,并滿足K i<=K 2*i+1且Ki<=K 2*i+2(K i>=K 2*i+1且Ki>=K 2*i+2) i = 0,1,2...,則稱為小堆(或大堆)。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。

性質:

  • 堆中某個節點的值總是不大于或不小于其父節點的值;
  • 堆總是一棵完全二叉樹。

結構:

1.大堆

C語言 深入解讀數據結構之堆的實現

2.小堆

C語言 深入解讀數據結構之堆的實現

 

堆(大根堆)的實現:

堆的接口:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int HPDataType;
typedef struct Heap
{
  HPDataType* a;
  int size;
  int capacity;
}HP;

//堆的創建
void HeapInit(HP*hp);
//堆的銷毀
void HeapDestroy(HP*hp);
//交換數值
void Swap(HPDataType *px, HPDataType *py);
//向上調整
void AdjustUp(int *a,int child);
//向下調整
void AdjustDown(int *a, int n, int parent);
//堆的插入
void HeapPush(HP*hp,HPDataType x);
//堆的刪除
void HeapPop(HP*hp);
//取堆頂的數據
HPDataType HeapTop(HP*hp);
//打印堆
void HeapPrint(HP*hp);
//堆的判空
bool HeapEmpty(HP*hp);
//堆的數據個數
int HeapSize(HP*hp);

堆的創建:

void HeapInit(HP*hp)
{
  assert(hp);
  hp->a=NULL;
  hp->capacity=hp->size=0;
}

堆的銷毀:

void HeapDestroy(HP*hp)
{
  assert(hp);
  free(hp->a);
  hp->capacity=hp->size=0;
}

交換數值:

void Swap(HPDataType*px, HPDataType*py)
{
  HPDataType tmp = *px;
  *px=*py;
  *py=tmp;
}

向上調整:

void AdjustUp(int*a, int child)
{
	assert(a);
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
          //交換數值
			Swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

堆得插入:

void HeapPush(HP*hp,HPDataType x)
{
  assert(hp);
  if(hp->capacity==hp->size)
  {
      size_t newCapacity=hp->capacity==0?4:hp->capacity*2;
      HPDataType * tmp=(HPDataType*)realloc(hp->a,newCapacity*sizeof(HPDataType));
      if(tmp==NULL)
      {
          printf("realloc is fail\n");
      }
      hp->a=tmp;
      hp->capacity=newCapacity;
      
  }
  hp->a[hp->size-1]=x;
  hp->size++;
  //向上調整
  AdjusiUp(hp->a,hp->size-1);
}

向下調整:

void AdjustDown(int *a,int n,int parent)
{
  int child=parent*2+1;
  while(child<n)
  {
      //比較左孩子還是右孩子大
      if(child+1<n && a[child+1]>a[child])
      {
          child++;
      }
      if(a[child]>a[parent])
      {
          Swap(&a[child],&a[parent]);
          parent=child;
          child=parent*2+1;
      }
      else
      {
          break;
      }
  }
}

堆的判空:

bool HeapEmpty(HP*hp)
{
  assert(hp);
  return hp->size==0;
}

堆的刪除:

void HeapPop(HP*hp)
{
	assert(hp);
  //堆的判空
	assert(!HeapEmpty(hp));
  //交換數值
	Swap(&hp->a[0], &hp->a[hp->size - 1]);
	hp->size--;
  //向下調整
	AdjustDown(hp->a, hp->size, 0);
}

取堆頂的數據:

HPDataType HeapTop(HP*hp)
{
  assert(hp);
  assert(!HeapEmpty(hp));
  return hp->a[0];
}

打印堆:

void HeapPrint(HP*hp)
{
  assert(hp);
  assert(!HeapEmpty(hp));
  for(int i=0; i<hp->size;i++)
  {
      printf("%d",hp->a[i]);
  }
  printf("\n");
}

堆的數據個數:

int HeapSize(HP*hp)
{
  assert(hp);
  return hp->size;
}

以上就是對堆的講解與操作實現。

感謝老鐵看到這里,如果文章對你有用的話請給我一個贊支持一下,感激不盡!

在下才疏學淺,一點淺薄之見,歡迎各位大佬指點。

以上就是C語言 深入解讀數據結構之堆的實現的詳細內容,更多關于C語言 數據結構的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/apple_52909052/article/details/121187795

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 久章草影院 | 狠狠干夜夜操 | 天天操天天看 | 久久激情国产 | 中日韩免费视频 | 欧美在线观看视频一区二区 | 在线播放视频一区二区 | 色综合777| 成人毛片在线免费看 | 玩偶姐姐 在线观看 | 国产精品成人免费一区久久羞羞 | 视频一区二区在线观看 | 色妇视频| 日本精品婷婷久久爽一下 | 久久久免费观看完整版 | 超91在线| 视频一区二区中文字幕 | 中文字幕精品在线播放 | 国产精品自在线拍 | 日本精品黄色 | 羞羞网站 | 日本在线免费观看 | 国产精品久久久久久久四虎电影 | 国产资源在线看 | 91精品国产91| 国产91在线免费 | 免费观看一级 | 精国产品一区二区三区 | 特级黄aaaaaaaaa毛片 | 依人在线视频 | 久色免费视频 | 一级做a爱片久久毛片a高清 | 斗破苍穹在线观看免费完整观看 | 欧美成人综合视频 | 夜夜看 | 久久在线| 欧美黄一区 | 国产一级淫片在线观看 | 国产精品视频一区二区三区四 | 国产精品99久久久久久久女警 | 欧美日韩精品一区二区三区蜜桃 |