堆排序及其時間空間複雜度分析
/*
* 堆排序
* 一個建立堆的函式,一個排序的函式
* heap初始建堆(大根堆),取得左右孩子中最大的結點,用其和根節點交換,
* 然後以此孩子結點繼續建堆
* heapSort 堆排序,先從非葉節點到跟進行迴圈建堆,交換根節點和最後一個元素的位置,在迴圈建堆,
* 時間複雜度:主要在於初始化建堆和後來交換後迴圈建堆的過程。
* 迴圈n-1次,每次從根0一直到葉節點是log(n),所以O(nlog(n))
* 初始化建堆為從非葉節點層的最右端一個結點向上迴圈建堆,2^(i-1)*(k-i) (i為當前層數,k為堆高度) O(n)
* 最好 最壞平均情況都需要迴圈建堆, O(nlogn)
* 空間複雜度:堆排序為原地排序,常量級額外空間 O()
*/
public static void heap(int []a,int parent,int len){ int temp=a[parent]; int child=2*parent+1; //獲得左孩子 while(child<len){ if(child+1<len&&a[child+1]>a[child]) child++; if(a[child]<=temp) break; a[parent]=a[child]; parent=child; //孩子結點為父節點 child=child*2+1; //孩子結點為當前結點的左結點 } a[parent]=temp; } public static void heapSort(int a[]){ for(int i=a.length/2-1;i>=0;i--) heap(a,i,a.length); for(int i=a.length-1;i>0;i--){ int temp=a[0]; a[0]=a[i]; a[i]=temp; heap(a,0,i); } }
相關推薦
堆排序及其時間空間複雜度分析
/* * 堆排序 * 一個建立堆的函式,一個排序的函式 * heap初始建堆(大根堆),取得左右孩子中最大的結點,用其和根節點交換, * 然後以此孩子結點繼續建堆 * heapSort 堆排序,先從非葉節點到跟進行迴圈
快速排序、程式碼實現(python3版)及其時間空間複雜度分析
快速排序是對氣泡排序的一種改進。基本思想是:通過一躺排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按次方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。最壞情況的時間複雜度為O(n2),最好情況時間複雜度
簡單排序演算法時間空間複雜度分析及應用(7)-希爾排序
希爾排序,屬於插入排序的一種,是直接插入排序的加強版。在希爾排序中引入了步長(gap)的概念,然而在插入排序中,步長預設為1。正如我們直接堆插入排序的分析,資料集合的排列順序對插入排序的效率會由很大的
八大排序演算法及時間空間複雜度分析,java版
//放在一起感覺又臭又長,所以每排序我單獨放出來了,歡迎大家平均交流指出不足import java.lang.reflect.Array;import java.util.*;public class EightKindOfSort {/*選擇排序 (不穩定演算法) *
排序演算法之 堆排序 及其時間複雜度和空間複雜度
堆排序是由1991年的計算機先驅獎獲得者、斯坦福大學計算機科學系教授羅伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同發明了的一種排序演算法( Heap Sort ); 堆排序(Heapsort
演算法設計與分析課程的時間空間複雜度
演算法設計與分析課程的時間空間複雜度: 總結 演算法 時間複雜度 空間複雜度 說明 Hanoi $ O(2^n) $ $ O(n) $ 遞迴使用 會場安排問題 \(O
卷積神經網路時間和空間複雜度分析
在深度學習的發展過程中,有意無意中,很多創新點都與改善模型計算複雜度密切相關。 因而,本文對CNN的時間和空間複雜度做以分析。 首先,明確下FLOPS和FLOPs的區別: FLOPS:注意全大寫,是floating point operations per second的縮寫,意指
時間複雜度&空間複雜度分析
時間複雜度: 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式f(n),進而分析f(n)隨n的變化情況並確定T(n)的數量級。這裡用"O"來表示數量級,給出演算法的時間複雜度。
一個時間複雜度為O(n)的排序演算法,空間複雜度為O(1)
package test; import java.util.HashSet; import java.util.Set; public class Test { public st
選擇排序的時間復雜度分析
family span lec 時間復雜度 一個 位置 最小 ack 破壞 每一趟從待排序的數據元素中選出最小(或最大)的一個元素,順序放在已排好序的數列的最前(最後),直到所有待排序的數據元素排完。選擇排序是不穩定的排序方法。 選擇排序是給每一個位置選擇當前元素
選擇排序基本思想及複雜度分析
/*選擇排序 (不穩定演算法) * 基本思想:兩個for迴圈巢狀,內部for迴圈用來找到最大(小)的元素,外部迴圈用來放置找到的元素 * 複雜度:需要遍歷陣列才能找到峰值元素,所以複雜度與原始序列是否有序無關,最好最壞和平均情況的時間複雜度都為O(n^2); * 需要一
就地歸併排序inplacMergeSort,空間複雜度O(1)
難度在就地歸併:說看程式碼及註釋。與上篇文章有點類似。 //============================================================================ //@lgh原創 //==================
時間空間複雜度(二分查詢和斐波那契數列)
時間複雜度: 時間複雜度就是函式執行的基本操作次數(運算次數) 在實際中,我們通常考量的是這個函式的最壞執行情況,即最大執行時間。 使用 O 來標記最壞執行情況的漸進上界——O的漸進表示法 需要注意的
關於時間 && 空間複雜度的個人見解
淺析時間 && 空間複雜度 一般的,我們評估一種演算法的優劣,可以使用其演算法的時間複雜度和空間複雜度來進行測量。而不管時間複雜度還是空間複雜度,都習慣性的被分為三種情況:最好,平均,最壞。在現實應用中,我們一般思考的都是最壞的時間 &
演算法的時間空間複雜度和空間複雜度總結
演算法的時間空間複雜度和空間複雜度總結 時間頻度 一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。 如何獲得T
堆排序的JAVA實現及時間複雜度分析
堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有
排序演算法之 插入排序、希爾(shell)排序 及其時間複雜度和空間複雜度
有一個已經有序的資料序列,要求在這個已經排好的資料序列中插入一個數,但要求插入後此資料序列仍然有序,這個時候就要用到一種新的排序方法——插入排序插入排序的基本操作就是將一個數據插入到已經排好序的有序資料中,從而得到一個新的、個數加一的有序資料,演算法適用於少
排序演算法之 歸併排序 及其時間複雜度和空間複雜度
在排序演算法中快速排序的效率是非常高的,但是還有種排序演算法的效率可以與之媲美,那就是歸併排序;歸併排序和快速排序有那麼點異曲同工之妙,快速排序:是先把陣列粗略的排序成兩個子陣列,然後遞迴再粗略分兩個子陣列,直到子數組裡面只有一個元素,那麼就自然排好序了,可
排序演算法之 基數排序 及其時間複雜度和空間複雜度
基數排序(radix sort)屬於“分配式排序”(distribution sort),又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數排序法是屬於穩定
排序演算法之 選擇排序 及其時間複雜度和空間複雜度
選擇排序(Selection sort)是一種簡單直觀的排序演算法。它的工作原理是每一次從待排序的資料元素中選出最小(或最大)的一個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。 選擇排序是不穩定的排序方法(比如序列[5, 5, 3]第一次就將第