中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

建e網模型官網seo快速排名培訓

建e網模型官網,seo快速排名培訓,蘄春網站建設,免費營銷培訓💗個人主頁💗 ?個人專欄——數據結構學習? 💫點擊關注🤩一起學習C語言💯💫 導讀: 我們在前面學習了單鏈表和順序表,以及棧和隊列。 今天我們來學習小堆。 關注博主或是訂閱專欄&a…

💗個人主頁💗
?個人專欄——數據結構學習?
💫點擊關注🤩一起學習C語言💯💫

導讀:

我們在前面學習了單鏈表和順序表,以及棧和隊列。
今天我們來學習小堆。
關注博主或是訂閱專欄,掌握第一消息。

1. 堆的概念及結構

現實中我們通常把堆(一種二叉樹)使用順序結構的數組來存儲,需要注意的是這里的堆和操作系統虛擬進程地址空間中的堆是兩回事,一個是數據結構,一個是操作系統中管理內存的一塊區(qū)域分段。

1.1 什么是堆

堆是一種特殊的數據結構,它可以看做是一個完全二叉樹(或者近似二叉樹),其中每個節(jié)點的值都大于等于(或小于等于)其子節(jié)點的值。在一個最大堆中,根節(jié)點的值是最大的;在一個最小堆中,根節(jié)點的值是最小的。
在這里插入圖片描述

1.2 堆的特點

堆的主要特點是:每個節(jié)點的值都大于等于(或小于等于)其子節(jié)點的值。這種特點使得堆可以快速找到最大(或最小)的元素。另外,堆還可以用于排序和優(yōu)先隊列等應用。
堆中兄弟節(jié)點的值之間沒有關聯。在堆中,節(jié)點之間的關系僅由其在樹中的位置決定。

1.3 堆的結構

堆通常使用數組來實現,數組的下標代表節(jié)點在堆中的位置。根據節(jié)點在數組中的位置,可以通過簡單的計算得到其父節(jié)點、左子節(jié)點和右子節(jié)點的位置。這樣,在堆中插入一個新元素、刪除堆頂的元素或者調整堆的結構時,只需要對數組進行簡單的操作,而不需要改變整個堆的結構。

2. 堆的實現

我們需要創(chuàng)建兩個 C文件: study.c 和 Heap.c,以及一個 頭文件: Heap.h。

頭文件來聲明函數,一個C文件來定義函數,另外一個C文件來用于主函數main()進行測試。

堆的常見操作包括插入元素、刪除堆頂元素、堆化(調整堆的結構使其滿足堆的特點)等。其中,插入元素和刪除堆頂元素的時間復雜度為O(logn),堆化的時間復雜度為O(nlogn)。

3. 代碼實現

3.1 定義結構體

Heap.h:

typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;		//記錄數組內的有效數據int capacity;	//記錄數組空間大小
}HP;

3.2 堆的初始化

Heap.h:

//堆的初始化
void HeapInit(HP* php);

Heap.c:

//堆的初始化
void HeapInit(HP* php)
{//各值初始化為0assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}

3.3 堆的銷毀

我們的數組空間是用malloc函數開辟的,使用完之后需要進行釋放。
Heap.h:

// 堆的銷毀
void HeapDestroy(HP* php);

Heap.c:

// 堆的銷毀
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = 0;php->capacity = 0;
}

3.4 向上調整父節(jié)點與子節(jié)點

在出入數組后,我們需要對數組進行調整,以實現堆的結構特點。
在數組中,下標*2+1就是他的子節(jié)點,同樣的下標-1/2就是他的父節(jié)點。
Heap.h:

//向上調整父節(jié)點與子節(jié)點
void AdjustUp(HPDataType* a, int child);

Heap.c:

//交換父節(jié)點和子節(jié)點的值
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
//向上調整父節(jié)點與子節(jié)點
void AdjustUp(HPDataType* a, int child)
{assert(a);int parent = (child - 1) / 2;//找到父節(jié)點while (child > 0){//查看父親節(jié)點與孩子節(jié)點的值//若小則替換,否則就結束循環(huán)if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

在這里插入圖片描述

3.5 堆的插入

Heap.h:

// 堆的插入
void HeapPush(HP* php, HPDataType x);

Heap.c:

// 堆的插入
// 堆的插入
void HeapPush(HP* php, HPDataType x)
{assert(php);//首先檢查數組容量是否足夠if (php->size == php->capacity){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;//在插入數值后需要檢查是否要進行調整AdjustUp(php->a, php->size);php->size++;
}

在這里插入圖片描述
在這里插入圖片描述

3.6 向下調整父節(jié)點與子節(jié)點

刪除堆是刪除堆頂的數據,但是我們無法直接刪除第一個元素,這有極大的可能會使我們的堆崩潰,不再具有堆的特點,而在刪除之后把其它數值都往前移動,再進行調整是一項很大的工作量。
所以我們可以將堆頂的數據根最后一個數據一換,然后刪除數組最后一個數據,再進行向下調整算法。將當前的根數值調整到符合堆特點的位置去。
Heap.h:

//向下調整父節(jié)點與子節(jié)點
void AdjustDown(int* a, int size, int parent);

Heap.c:

//向下調整父節(jié)點與子節(jié)點
void AdjustDown(int* a, int size, int parent)
{assert(a);int child = parent * 2 + 1;//找到孩子節(jié)點while (child < size){//找孩子中較小的一個if ((a[child] > a[child + 1]) && (child + 1) < size){child += 1;}//判斷兩個大小進行交換if (a[parent] > a[child]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}

3.7 堆的刪除

Heap.h:

// 堆的刪除
void HeapPop(HP* php);

Heap.c:

// 堆的刪除
void HeapPop(HP* php)
{assert(php);//先檢查數組是否有可刪除的數據assert(php->size > 0);//交換首尾元素Swap(&php->a[php->size - 1], &php->a[0]);php->size--;//向下進行調整AdjustDown(php->a, php->size, 0);}

在這里插入圖片描述
在這里插入圖片描述

3.8 獲取堆頂元素

返回數組首元素即可
Heap.h:

// 取堆頂的數據
HPDataType HeapTop(HP* php);

Heap.c:

// 取堆頂的數據
HPDataType HeapTop(HP* php)
{assert(php);return php->a[0];
}

3.9 獲取堆的個數

直接返回size的值即可
Heap.h:

// 堆的數據個數
size_t HeapSize(HP* php);

Heap.c:

// 堆的數據個數
size_t HeapSize(HP* php)
{assert(php);return php->size;
}

3.10 堆的判空

只需判斷size的值是否為0,如果是,返回true,反之返回false。
Heap.h:

// 堆的判空
bool HeapEmpty(HP* php);

Heap.c:

// 堆的判空
bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}

4. 代碼整理

4.1 Heap.h

#define _CRT_SECURE_NO_WARNINGS 
#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* php);// 堆的銷毀
void HeapDestroy(HP* php);// 堆的插入
void HeapPush(HP* php, HPDataType x);// 堆的刪除
void HeapPop(HP* php);// 取堆頂的數據
HPDataType HeapTop(HP* php);// 堆的數據個數
size_t HeapSize(HP* php);// 堆的判空
bool HeapEmpty(HP* php);//向上調整父節(jié)點與子節(jié)點
void AdjustUp(HPDataType* a, int child);//向下調整父節(jié)點與子節(jié)點
void AdjustDown(int* a, int size, int parent);//交換父節(jié)點和子節(jié)點的值
void Swap(int* child, int* parent);

4.2 Heap.c

#include "Heap.h"//堆的初始化
void HeapInit(HP* php)
{//各值初始化為0assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}// 堆的銷毀
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = 0;php->capacity = 0;
}//交換父節(jié)點和子節(jié)點的值
void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
//向上調整父節(jié)點與子節(jié)點
void AdjustUp(HPDataType* a, int child)
{assert(a);int parent = (child - 1) / 2;//找到父節(jié)點while (child > 0){//查看父親節(jié)點與孩子節(jié)點的值//若小則替換,否則就結束循環(huán)if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
// 堆的插入
void HeapPush(HP* php, HPDataType x)
{assert(php);//首先檢查數組容量是否足夠if (php->size == php->capacity){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);if (tmp == NULL){perror("realloc fail");return;}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;//在插入數值后需要檢查是否要進行調整AdjustUp(php->a, php->size);php->size++;
}//向下調整父節(jié)點與子節(jié)點
void AdjustDown(int* a, int size, int parent)
{assert(a);int child = parent * 2 + 1;//找到孩子節(jié)點while (child < size){//找孩子中較小的一個if ((a[child] > a[child + 1]) && (child + 1) < size){child += 1;}//判斷兩個大小進行交換if (a[parent] > a[child]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}// 堆的刪除
void HeapPop(HP* php)
{assert(php);//先檢查數組是否有可刪除的數據assert(php->size > 0);//交換首尾元素Swap(&php->a[php->size - 1], &php->a[0]);php->size--;//向下進行調整AdjustDown(php->a, php->size, 0);}// 取堆頂的數據
HPDataType HeapTop(HP* php)
{assert(php);return php->a[0];
}// 堆的數據個數
size_t HeapSize(HP* php)
{assert(php);return php->size;
}// 堆的判空
bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}

4.3 study.c

void Test1()
{int array[] = { 27,15,19,18,28,34,65,49,25,37 };HP hp;HeapInit(&hp);for (int i = 0; i < sizeof(array) / sizeof(int); i++){HeapPush(&hp, array[i]);//插入數據}int k = HeapSize(&hp);while (k--){printf("%d ", HeapTop(&hp));HeapPop(&hp);}HeapDestroy(&hp);
}int main()
{;Test1();return 0;
}

在這里插入圖片描述

http://m.risenshineclean.com/news/62925.html

相關文章:

  • 公司建設官方網站需要多少錢做運營的具體做什么
  • ps海報素材網站先做后付費的代運營
  • 做二手車的網站有哪些外貿營銷網站
  • wordpress表白模板下載seo推廣平臺
  • 中國flash網站模板中心西安百度推廣優(yōu)化
  • apple開發(fā)者中心商品標題seo是什么意思
  • 酷炫網站模板抖音seo供應商
  • b站做簡介的網站中央電視臺一套廣告價目表
  • DW做旅游網站畢業(yè)設計精準網絡推廣
  • 用網站做自我介紹pptseo教程免費
  • 培訓網站開發(fā)機構免費網站大全
  • 南寧手機網站建設網站seo診斷
  • 贛州那里有做網站的公司cba排名
  • 提供建站服務的網絡公司的比較培訓
  • 網站建設學習心得愛站網seo
  • 做貿易進出口要什么網站平臺網絡銷售好做嗎
  • 怎么申請 免費網站站長工具排行榜
  • 企業(yè)網站建設空間如何免費推廣網站
  • 公司網站 用 個人備案域名藝考培訓學校
  • 購買網站空間的方法南寧seo公司
  • 服務器網站怎么用360渠道推廣系統
  • 做外貿網站要花多少錢怎么制作網頁教程
  • 可以做動效的網站產品網絡營銷策劃方案
  • 51一起做網站0元做游戲代理
  • 做社交網站寧波企業(yè)seo推廣
  • 廈門稅務門戶網站怎么提高關鍵詞搜索排名
  • 嵊州市建設局網站武漢seo優(yōu)化服務
  • 沈陽企業(yè)自助建站系統營銷策略的思路
  • 網站在建設中無法訪問seo站內優(yōu)化教程
  • 搭建英文網站公關公司提供的服務有哪些