關於堆排序建堆時間複雜度的證明
建堆的過程,看起來外面一層迴圈O(n),裡面是個logn的調整函式,時間複雜度貌似是nlogn的,但是仔細分析,其實質是O(n)的。
證明如下:
首先,對於高度為h的完全二叉樹,其第i層的元素個數為2^(i-1),對於堆的每一層,調整的深度都不一樣,每層的元素的調整深度小於等於h-i,假設每層調整的深度是h-i,欲構建的堆是個完全二叉樹,那麼對於每層來說:
最後一層不用調整;
倒數第二層的消耗是:2^(h-1)*1;
倒數第三層的消耗是:2^(h-2)*2;
。。。。。。
第一層的消耗是:2^(h-h)*(h-1);
加起來總消耗是:S=2^(h-1)*1+2^(h-2)*2+。。。+h;
2S=2^h*1+2^(h-1)*2+。。。+2*h;
S=2^h+2^(h-1)+2^(h-2)+。。。+2^1-h;
S=2^h+2^(h-1)+2^(h-2)+。。。+2^1+2^0-h-1;
S=2^(h+1)-2-h;
h=logn;
代入得:S=2*n-2-logn;
故堆排序的建堆過程是O(n)的。
相關推薦
堆排序演算法及時間複雜度分析
堆其實通常是通過一維陣列來實現的,在陣列起始下標為0的情況下,父節點i的左右子節點分別為2*i+1和2*i+2,子節點i的父節點為(i-1)/2。對堆的操作主要有建堆、調整堆、堆排序、插入和刪除堆中元素。其中調整堆是核心。下面將重點介紹兩種調整堆的方法。 向下調整堆(shi
關於堆排序建堆時間複雜度的證明
建堆的過程,看起來外面一層迴圈O(n),裡面是個logn的調整函式,時間複雜度貌似是nlogn的,但是仔細分析,其實質是O(n)的。 證明如下: 首先,對於高度為h的完全二叉樹,其第i層的元素個數為2^(i-1),對於堆的每一層,調整的深度都不一樣,每層的元素的調整深度小於
堆排序建堆複雜度為O(n)的證明
今天重溫堆排序,在網上搜了好多部落格文章,都是泛泛而談。有的只講了思路,有的直接貼上一份或幾份程式碼。好一點的對複雜度進行了分析,但是講到建堆複雜度,就一筆帶過或者說請參考演算法導論××頁。我覺得求建堆複雜度並不難,瞭解一下對於理解堆排序是有好處的,下文為求解過程。 堆排
比較演算法排序時間複雜度證明過程
比較演算法排序 證明過程 通過排序樹,我們將陣列的比較過程分解(兩數相比得到的結果將為二叉樹) 則所有的葉節點的排列順序為可能的排列順序(若有nnn個元素,則排列個數為n!n!n!) 則決策樹的規模為指數級。(論文中出現的虛擬碼雖然及其難懂但長度較為固定)
常用排序演算法的時間複雜度和空間複雜度及特點
一、常用排序演算法的時間複雜度和空間複雜度表格 二、特點 1.歸併排序: (1)n大時好,歸併比較佔用記憶體,記憶體隨n的增大而增大,但卻是效率高且穩定的排序演算法。 (2)歸併排序每次遞迴都要用到一個輔助表,長度與待排序的表長度相同,雖然遞迴次數是O(log2n),但每次
圖解常見排序方法的時間複雜度
常見排序方法及其複雜度 幾種複雜的表示方式: O(1): 耗時/耗空間與輸入資料大小無關 O(n): 就代表資料量增大幾倍,耗時也增大幾倍。比如常見的遍歷演算法。 O(n2),就代表資料量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間複雜度。比如氣泡排序、遞迴演算法,就是典型的O
八種排序演算法的時間複雜度複雜度
https://www.cnblogs.com/dll-ft/p/5861210.html 轉載 1、穩定性 歸併排序、氣泡排序、插入排序。基數排序是穩定的 選擇排序、快速排序、希爾排序、堆排序是不穩定的 2、時間複雜度 最基礎的四個演算法:冒泡、選擇
各種排序演算法的時間複雜度
選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法, 氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 排序演算法不穩定的含義是:在排序之前,有兩個數相等. 但是在排序結束之後,它們兩個有可能改變順序. 比如說: 在一個待排序佇列中,A和B相等,且A排在
常用排序演算法以及時間複雜度
希爾排序 快速排序 二叉樹排序 氣泡排序 選擇排序 堆排序 #include <iostream.h> #include <conio.h> #include <stdlib.h> #include <time.h>
實現排序演算法,時間複雜度為O(n)
我們常用的排序氣泡排序 O(n^2); 快速排序O(nlogn);堆排序O(nlogn);選擇排序O(n^2); 我們常用的排序都不符合時間複雜度的要求; 經常聽說一個說法 用空間代替時間 現在要排序的陣列為陣列 a;例如a數組裡面有 1,1,2,2,3,3,2,2,5
【整理】常見排序演算法及其時間複雜度總結
原文出處: 本篇主要整理了氣泡排序,直接插入排序,直接選擇排序,希爾排序,歸併排序,快速排序,堆排序七種常見演算法,是從上面三篇博文中摘抄整理的,非原創。 一、氣泡排序 主要思路是: 通過交換相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就“沉”到最後面了。重複N次即可以使陣列有序。 氣泡
氣泡排序演算法、時間複雜度和穩定性
氣泡排序 氣泡排序一般是我們學習排序演算法時第一個接觸的演算法,下面來介紹一下氣泡排序。 演算法原理 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一步,最後的元素應該會是最大
各個排序演算法的時間複雜度、空間複雜度、穩定性
排序演算法分類 排序演算法比較表格填空 排序演算法比較表格 1 歸併排序可以通過手搖演算法將空間複雜度降到O(1),但是時間複雜度會提高。注: 2 基數排序時間複雜度為O(N*M),其中N為資料個數,M為資料位數。 輔助記憶 時間複雜度記憶-
樹狀陣列的時間複雜度證明
build 根據建立的方法可以容易的寫出遞推式: T(n)=T(n−1)+height(n) T ( n
關於基於比較的排序演算法,時間複雜度“最壞”下界o(nlogn)與“最優”下界o(n)說明
前言 之前在查詢基於比較排序演算法的時間複雜度時發現,好多博主對“最壞”下界與“最優”下界沒有分清,而是預設的把時間複雜度o(nlogn)當成了“最優”下界。這樣很是誤導大家,影響很不好。所以特此寫一篇說明文章,能讓大家理解得更透徹。 下界
排序演算法的時間複雜度和空間複雜度-----總結
演算法的時間複雜度是指:演算法執行過程中所需要的基本運算次數。 常見的演算法時間複雜度由小到大依次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n^2)<Ο(n^3)<…<Ο(2^n)<Ο(n!)。其中O(1)表示基本語句的執行次數是一個常數,一般來說,
氣泡排序+怎麼計算時間複雜度
氣泡排序的基本思想 時間複雜度為O(N^2) 每次比較兩個相鄰元素,如果他們的順序錯誤就把它們交換過來。 舉個栗子 例如我們需要將 12,35,99,18,76, 5個數進行從大到小排序,既然是從大到小排序,也就是越小越靠後。 首先比較第一個數和第二
插入排序演算法、時間複雜度和穩定性
插入排序 演算法原理 將資料分為有序部分和無序部分。 在無序部分選擇一個元素,按照順序插入到有序部分,使之有序。 直到無序部分都插入到有序部分結束。 演算法分析 排序的思想就是維護一個有序的部分,將無序部分的資料按照順序插入到有序部分。 通
BZOJ2038: [2009國家集訓隊]小Z的襪子(hose) 莫隊演算法 莫隊演算法講解及時間複雜度證明
2038: [2009國家集訓隊]小Z的襪子(hose) Time Limit: 20 Sec Memory Limit: 259 MB Submit: 7088 Solved: 3258
常用的排序演算法的時間複雜度和空間複雜度
排序法 最差時間分析 平均時間複雜度 穩定度 空間複雜度 氣泡排序 O(n2) O(n2) 穩定 O(1) 快速排序 O(n2) O(n*log2n) 不穩定 O(log2n)~O(n) 選擇排序 O(n2) O(n2) 穩定 O(1) 二叉樹排序 O(n2) O(n*log2