快速排序實現以及時間複雜度分析
平均時間複雜度分析:
T(1) = 1;
T(n) = 2*T(n/2) + a*n;(a為常數,每次合併時,複雜度為O(n))
= 2*(2*T(n/4)+a*n/2) + a*n
= 4*T(n/4) + 2*a*n
= 4*(2*T(n/8)+a*n/4) + 2*a*n
= 8*T(n/8) + 3*a*n
=......
= 2^k*T(1) + k*a*n (其中n==2^k,即k=log2(n))
= n + a*n*log2(n);
所以時間複雜度為O(nlogn)
相關推薦
快速排序實現以及時間複雜度分析
平均時間複雜度分析: T(1) = 1; T(n) = 2*T(n/2) + a*n;(a為常數,每次合併時,複雜度為O(n)) = 2*(2*T(n/4)+a*n/2) + a*n = 4*T(n/4) + 2*a*n = 4*(2*T(n/8)+a*n/4) + 2*a*n = 8*T(n/8) + 3
排序演算法——希爾排序的圖解、程式碼實現以及時間複雜度分析
希爾排序(Shellsort) 希爾排序是衝破二次時間屏障的第一批演算法之一。 希爾排序通過比較相距一定間隔的元素來工作;各躺比較所用的距離隨著演算法的進行而減小,直到只比較相鄰元素的最後一趟排序為止。由於這個原因,希爾排序有時也叫做縮減增量排序。 希爾排
排序演算法——插入排序的圖解、程式碼實現以及時間複雜度分析
插入排序 插入排序的原理: 插入排序由N-1躺排序完成,對於p=1到N-1躺,插入排序保證從位置0到位置p的元素為已排序狀態。 插入排序的程式碼實現: /** * 插入排序的實現例程,特點是使用了泛型,可以接受任何實現了Compa
快速排序演算法及時間複雜度分析(原地in-place分割槽版本)
快速排序演算法一般來說是採用遞迴來實現,其最關鍵的函式是partition分割函式,其功能是將陣列劃分為兩部分,一部分小於選定的pivot,另一部分大於選定的pivot。我們將重點放在該函式上面。 partition函式總體思路是自從一邊查詢,找到小於pivot的元素,則將
常見排序演算法的基本原理、程式碼實現和時間複雜度分析
排序演算法無論是在實際應用還是在工作面試中,都扮演著十分重要的角色。最近剛好在學習演算法導論,所以在這裡對常見的一些排序演算法的基本原理、程式碼實現和時間複雜度分析做一些總結 ,也算是對自己知識的鞏固。 說明: 1.本文所有的結果均按照非降序排列; 2.本文所有的程式均用c++實現,
堆排序的JAVA實現及時間複雜度分析
堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有
淺談直接插入排序演算法思想以及時間複雜度分析
研究意義 直接插入排序是最基本的一種排序演算法,其思想簡單,容易掌握,對後期的學習也有一定的幫助。 必備知識(之後不再敘述) 排序:將一組雜亂無章的資料排列成一個按關鍵字有序的序列。 穩定性:關鍵值相
常用排序演算法以及時間複雜度
希爾排序 快速排序 二叉樹排序 氣泡排序 選擇排序 堆排序 #include <iostream.h> #include <conio.h> #include <stdlib.h> #include <time.h>
二分查詢法的迴圈與遞迴實現及時間複雜度分析
設陣列為整數陣列,從小到大排序。二分法強調一定是要先排過序的。 迴圈實現二分法程式碼: #include <iostream> using namespace std; int binary_search(int *array,int low ,int hi
堆排序演算法及時間複雜度分析
堆其實通常是通過一維陣列來實現的,在陣列起始下標為0的情況下,父節點i的左右子節點分別為2*i+1和2*i+2,子節點i的父節點為(i-1)/2。對堆的操作主要有建堆、調整堆、堆排序、插入和刪除堆中元素。其中調整堆是核心。下面將重點介紹兩種調整堆的方法。 向下調整堆(shi
快速排序演算法詳解(原理、實現和時間複雜度)
快速排序是對氣泡排序的一種改進,由 C.A.R.Hoare(Charles Antony Richard Hoare,東尼·霍爾)在 1962 年提出。 快速排序的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料比另一部分的所有資料要小,再按這種方法對這兩部分資料分別進行快速排
【資料結構】實現順序表以及簡單的時間複雜度分析
最近在學資料結構,接下來一段時間我將用java來實現所學的各種資料結構,以加深自己的印象。 線性表包括順序表和連結串列,其實順序表就是動態陣列,下面我將二次封裝實現屬於自己的動態陣列。 -------------------------------------------
快速排序及時間複雜度分析
它的基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料
快速排序和歸併排序的時間複雜度分析——通俗易懂
# 一、前言 今天面試的時候,被問到歸併排序的時間複雜度,這個大家都知道是``O(nlogn)``,但是面試官又繼續問,怎麼推匯出來的。這我就有點懵了,因為之前確實沒有去真正理解這個時間複雜度是如何得出的,於是就隨便答了一波(理解了之後,發現面試的時候答錯了......)。 &em
資料結構與演算法--蠻力法之氣泡排序與時間複雜度分析(java)
蠻力法 蠻力法又稱窮舉法和列舉法,是一種簡單直接地解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。但是蠻力法所設計的演算法時間特性往往是比較低的,典型的指數時間演算法一般都是通過蠻力
【資料結構與演算法-java實現】二 複雜度分析(下):最好、最壞、平均、均攤時間複雜度的概念
上一篇文章學習了:如何分析、統計演算法的執行效率和資源消耗? 點選連結檢視上一篇文章:複雜度分析上 今天的文章學習以下內容: 最好情況時間複雜度 最壞情況時間複雜度 平均情況時間複雜度 均攤時間複雜度 1、最好與最壞情況時間複雜度 我們首先
實現排序演算法,時間複雜度為O(n)
我們常用的排序氣泡排序 O(n^2); 快速排序O(nlogn);堆排序O(nlogn);選擇排序O(n^2); 我們常用的排序都不符合時間複雜度的要求; 經常聽說一個說法 用空間代替時間 現在要排序的陣列為陣列 a;例如a數組裡面有 1,1,2,2,3,3,2,2,5
常用排序演算法穩定性、時間複雜度分析
1、 選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法, 氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 2、研究排序演算法的穩定性有何意義? 首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資
排序演算法 (穩定性時間複雜度分析)
1、 選擇排序、快速排序、希爾排序、堆排序不是穩定的排序演算法, 氣泡排序、插入排序、歸併排序和基數排序是穩定的排序演算法。 2、研究排序演算法的穩定性有何意義? 首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前兩個相等的資
二叉樹時間複雜度分析及增刪改查操作java實現
順序表和連結串列的時間複雜度由給定條件不同從而會得出不同的時間複雜度結果,對於程式設計時並不總是最好用的儲存方式。二叉樹是一種更加穩定的資料儲存方式,其複雜度總是能表示為一個固定的形式。以下來分析二叉樹增刪改查操作做的時間複雜度。 設有如下資料需要進行二叉樹形式儲存: