国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

做美食推廣的網(wǎng)站朝陽(yáng)區(qū)搜索優(yōu)化seosem

做美食推廣的網(wǎng)站,朝陽(yáng)區(qū)搜索優(yōu)化seosem,電子商務(wù)網(wǎng)站名字,寧波建設(shè)局網(wǎng)站首頁(yè)看這篇前請(qǐng)先把我上一篇了解一下:深入理解數(shù)據(jù)結(jié)構(gòu)第一彈——二叉樹(shù)(1)——堆-CSDN博客 前言: 相信很多學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人,都會(huì)遇到一種情況,就是明明最一開(kāi)始學(xué)習(xí)就學(xué)習(xí)了時(shí)間復(fù)雜度,但是在后期…

看這篇前請(qǐng)先把我上一篇了解一下:深入理解數(shù)據(jù)結(jié)構(gòu)第一彈——二叉樹(shù)(1)——堆-CSDN博客

前言:

相信很多學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人,都會(huì)遇到一種情況,就是明明最一開(kāi)始學(xué)習(xí)就學(xué)習(xí)了時(shí)間復(fù)雜度,但是在后期自己寫(xiě)的程序或者是做到哪個(gè)需要判斷時(shí)間復(fù)雜度的題時(shí),仍然判斷不出來(lái)時(shí)間復(fù)雜度是多少,今天,我們結(jié)合我們上期學(xué)習(xí)的堆,給大家深入剖析一下時(shí)間復(fù)雜度這個(gè)概念,同時(shí)更深入的理解堆的概念,方便我們后期應(yīng)用堆進(jìn)行排序等。

目錄

一、堆排序

1、堆排序的大體思路

2、堆排序的實(shí)例講解

二、堆排序的時(shí)間復(fù)雜度

向下排序的時(shí)間復(fù)雜度

向上排序的時(shí)間復(fù)雜度

堆排序整體的時(shí)間復(fù)雜度

總結(jié)


一、堆排序

1、堆排序的大體思路

在上一篇我們已經(jīng)講過(guò)了堆是什么東西,我們已經(jīng)知道堆有大堆和小堆兩種形式,堆排序的想法正是借助它的這個(gè)特點(diǎn)誕生的,例如:

數(shù)組 { 7,8 ,3 ,5 ,1 ,9 ,5 ,4}在堆中分布為:

如圖展示的是小堆,首先我們先強(qiáng)調(diào)一點(diǎn),降序是需要小堆來(lái)解決,升序是需要大堆來(lái)解決

比如說(shuō)圖上這個(gè)數(shù)組,我們要求它的降序序列時(shí),因?yàn)槎秧斣匾欢ㄊ嵌阎凶钚〉?#xff0c;所以我們就可以把堆頂元素與堆尾元素進(jìn)行交換,然后把堆尾元素刨除在外再進(jìn)行降序排列

2、堆排序的實(shí)例講解

堆排序與堆相比并沒(méi)有什么新東西,把我前面那章看明白,這里直接把代碼呈上

(除了test.c)其他的是直接從上一章搬過(guò)來(lái)的

Seqlist.h

typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int sz;int capacity;
}HP;//初始化
void HeapInit(HP* php);
//銷(xiāo)毀
void HeapDestory(HP* php);
//插入
void HeapPush(HP* php, HPDataType x);
//刪除
void HeapPop(HP* php);
//找堆頂元素
HPDataType HeapTop(HP* php);
//判斷是否為空
bool HeapEmpty(HP* php);
//算個(gè)數(shù)
int HeapSize(HP* php);

test.c

//堆排序
void HeapSort(int* a, int n)
{//建堆——向下調(diào)整建堆O(N-log(n))for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);//再調(diào)整,選出次小數(shù)AdjustDown(a, end, 0);end--;}
}
int main()
{int a[] = { 7,8,3,5,1,9,5,4 };HeapSort(a, sizeof(a) / sizeof(int));return 0;
}

Seqlist.c

//堆
//初始化
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->capacity = 0;php->sz = 0;
}
//銷(xiāo)毀
void HeapDestory(HP* php)
{free(php->a);free(php);
}
//交換
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}
//刪除//向上調(diào)整(小堆)
void AdjustUp(HPDataType* a, int child)
{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;}}
}
//向下調(diào)整
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;}}
}//插入
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->sz == php->capacity){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);php->a = tmp;php->capacity = newcapacity;}php->a[php->sz] = x;php->sz++;//向上調(diào)整AdjustUp(php->a, php->sz - 1);
}
//刪除
void HeapPop(HP* php)
{assert(php);assert(!HeapEmpty(php));Swap(&php->a[0], &php->a[php->sz - 1]);php->sz--;//向下調(diào)整AdjustDown(php->a, php->sz,0);
}
//判斷是否為空
bool HeapEmpty(HP* php)
{assert(php);return php->sz == 0;
}
//找堆頂元素
HPDataType HeapTop(HP* php)
{assert(php);assert(!HeapEmpty(php));return php->a[0];
}
//算個(gè)數(shù)
int HeapSize(HP* php)
{assert(php);return php->sz;
}

實(shí)現(xiàn)上述代碼,我們就可以實(shí)現(xiàn)堆排序了

二、堆排序的時(shí)間復(fù)雜度

我們都知道在實(shí)現(xiàn)堆時(shí)有向上排序和向下排序兩種,細(xì)心的人可能已經(jīng)注意到,我在實(shí)現(xiàn)上面那個(gè)堆排序用例時(shí),用的是向下排序,原因就是向下排序的時(shí)間復(fù)雜度更低,接下來(lái),我們就來(lái)分析一下這兩種排序各自的時(shí)間復(fù)雜度

向下排序的時(shí)間復(fù)雜度

向上排序的時(shí)間復(fù)雜度

堆排序整體的時(shí)間復(fù)雜度

計(jì)算堆排序整體的時(shí)間復(fù)雜度就是計(jì)算上面這兩步的時(shí)間復(fù)雜度

第一步:

因?yàn)檫@一步實(shí)際上就是多次向下調(diào)整建堆,所以這一步時(shí)間復(fù)雜度就是向下調(diào)整法時(shí)間復(fù)雜度的倍數(shù),那根據(jù)漸進(jìn)表示法就可以表示為O(N-log(N)),因?yàn)楫?dāng)N很大時(shí),log(N)比N小很多,所以可以忽略表示為O(N)

第二步:

第二步外循環(huán)需要N次,內(nèi)循環(huán)看似每次都是一個(gè)完整的向下排序法,但其實(shí)隨著循環(huán)次數(shù)的增加,里面向下排序的時(shí)間復(fù)雜度在不斷減小,因?yàn)槎盐才胚^(guò)去的數(shù)字實(shí)際上就不用再參與堆排序的,所以這一步時(shí)間復(fù)雜度實(shí)際上是O(N*log)

因此,堆排序的時(shí)間復(fù)雜度為O(N+N*log(N))

總結(jié)

堆排序及其時(shí)間復(fù)雜度的講解就到此為止了,如果有不理解的地方歡迎在評(píng)論區(qū)中指出或者與我私信交流,歡迎各位大佬來(lái)訪(fǎng)!!!

創(chuàng)作不易,還請(qǐng)各位大佬點(diǎn)贊支持!!!

http://aloenet.com.cn/news/28531.html

相關(guān)文章:

  • 寧波網(wǎng)站建設(shè)公司軟文范例大全1000字
  • 大連企業(yè)做網(wǎng)站最新軍事新聞 今日 最新消息
  • 婚戀網(wǎng)站女孩子做美容安卓?jī)?yōu)化大師官方版
  • 保定定興網(wǎng)站建設(shè)對(duì)百度競(jìng)價(jià)排名的看法
  • 織夢(mèng)的手機(jī)端網(wǎng)站網(wǎng)站開(kāi)發(fā)的步驟
  • 食品網(wǎng)站建設(shè)策劃書(shū)百度問(wèn)答庫(kù)
  • 網(wǎng)站沒(méi)有備案可以做百度推廣嗎最吸引人的引流話(huà)術(shù)
  • 青島網(wǎng)站運(yùn)營(yíng)推廣關(guān)鍵詞排名方案
  • 合肥建站平臺(tái)windows優(yōu)化大師官方免費(fèi)
  • html網(wǎng)站開(kāi)發(fā)中的應(yīng)用百度高級(jí)搜索
  • 濟(jì)南網(wǎng)站設(shè)計(jì)建設(shè)公司百度營(yíng)銷(xiāo)推廣登錄平臺(tái)
  • 建設(shè)資格執(zhí)業(yè)注冊(cè)中心網(wǎng)站長(zhǎng)沙seo網(wǎng)絡(luò)推廣
  • 網(wǎng)站上的搜索怎么做青島網(wǎng)站快速排名提升
  • 網(wǎng)站建設(shè)周期重慶seo網(wǎng)絡(luò)推廣關(guān)鍵詞
  • swf做網(wǎng)站頭網(wǎng)絡(luò)促銷(xiāo)
  • 知名商城網(wǎng)站建設(shè)公司seo搜狗
  • 東莞設(shè)計(jì)網(wǎng)站長(zhǎng)沙網(wǎng)站優(yōu)化推廣
  • 17網(wǎng)站一起做網(wǎng)店 每日新款網(wǎng)站免費(fèi)推廣網(wǎng)站
  • 高州做網(wǎng)站seo咨詢(xún)茂名
  • 可以免費(fèi)建手機(jī)網(wǎng)站seo優(yōu)化網(wǎng)站
  • 最新網(wǎng)站源碼營(yíng)銷(xiāo)網(wǎng)站建設(shè)方案
  • 武漢市網(wǎng)站制作寧波seo推廣咨詢(xún)
  • 網(wǎng)站制作要多少錢(qián)線(xiàn)上營(yíng)銷(xiāo)工具
  • 有域名自己做網(wǎng)站嗎網(wǎng)絡(luò)推廣長(zhǎng)沙網(wǎng)絡(luò)推廣
  • 各省備案網(wǎng)站怎么用模板做網(wǎng)站
  • 手機(jī)網(wǎng)站制作代理公關(guān)公司排名
  • 廣州官網(wǎng)建設(shè)seo搜索優(yōu)化是什么意思
  • 知識(shí)付費(fèi)網(wǎng)站開(kāi)發(fā)教程百度搜索提交入口
  • 做網(wǎng)站鏈接容易嗎百度手機(jī)瀏覽器下載
  • 網(wǎng)頁(yè)設(shè)計(jì)心得體會(huì)報(bào)告怎么寫(xiě)怎么理解搜索引擎優(yōu)化