1. 程式人生 > >排序的最好和最壞的時間複雜度問題

排序的最好和最壞的時間複雜度問題

排序時間複雜度問題

面試時被問到氣泡排序,選擇排序和快速排序的時間複雜度問題,由於自己基礎不紮實,當場懵逼,這件事一直讓我反思了好幾天。

可能你會正確地寫出這幾種排序,可能你會背過別人給你說的時間複雜度。我也是這樣。

先說氣泡排序:

氣泡排序不管序列是怎樣,都是要比較n(n-1)/2 次的,O(N2),

而對於交換次數來說,如果是陣列是有序的則,只不需要交換。如果陣列是逆序的則需要交換n(n-1)/2次,平均來說陣列要交換O(N2/4)

所以時間複雜度最好和最壞都是O(N2)

選擇排序是氣泡排序的改進

同樣選擇排序無論序列是怎樣的都是要比較n(n-1)/2次的,這是比較次數

而對於交換次數來說:如果陣列有序則不需要交換,如果逆序則要交換n次

總得來說,時間複雜度最好和最壞都是O(N2)

插入排序不同

如果序列是完全有序的,插入排序只要比較n次,無需移動時間複雜度為O(N)

如果序列是逆序的,插入排序要比較O(N2)和移動O(N2)

總得來說,時間複雜度最好的情況是O(N),最差的情況是O(N2)

快速排序

快速排序的時間複雜度最好是O(nlogn),平均也是O(nlogn),這種情況是軸樞恰好能把兩側的分開。

時間複雜度最差是O(N2),最差的情況選擇的軸樞在陣列最左側或是最右側

相關推薦

演算法導論 第二章:演算法入門 筆記 (插入排序、迴圈不變式、演算法分析、最好時間複雜、選擇排序、分治法、合併排序

插入排序: 排序問題的定義如下: 輸入:N個數{a1, a2,..., an }。 輸出:輸入序列的一個排列{a'1 ,a'1 ,...,a'n },使得a'n <=a' n<=...<

JavaScript 演算法之最好時間複雜分析

上一篇文章中介紹了複雜度的分析,相信小夥伴們對常見程式碼的時間或者空間複雜度肯定能分析出來了。 思考測試 話不多說,出個題目考考大家,分析下面程式碼的時間複雜度(ps: 雖然說並不會這麼寫) function find(n, x, arr) { let ind = -1;

時間複雜為N^2排序(冒泡-選擇-插入)

氣泡排序 public void bubblesort(int a[]) { int len=a.length; int i=len-1; int last=0; while(

排序最好時間複雜問題

排序時間複雜度問題 面試時被問到氣泡排序,選擇排序和快速排序的時間複雜度問題,由於自己基礎不紮實,當場懵逼,這件事一直讓我反思了好幾天。 可能你會正確地寫出這幾種排序,可能你會背過別人給你說的時間複雜度。我也是這樣。 先說氣泡排序: 氣泡排序不管序列是怎樣,都是要比較n(n

常見排序演算法及對應的時間複雜空間複雜

轉載請註明出處: 排序演算法經過了很長時間的演變,產生了很多種不同的方法。對於初學者來說,對它們進行整理便於理解記憶顯得很重要。每種演算法都有它特定的使用場合,很難通用。因此,我們很有必要對所有常見的排序演算法進行歸納。 排序大的分類可以分為兩種:內

資料結構中排序查詢各種時間複雜

(1)氣泡排序         氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。 (2)選擇排序       選擇排序是給每個位置選擇當前元

快速排序二分查詢時間複雜詳解

快速排序的時間主要耗費在劃分操作上,對長度為 k 的區間進行劃分,共需 k-1 次關鍵字的比較。最壞時間複雜度:最壞情況是每次劃分選取的基準都是當前無序區中關鍵字最小(或最大)的記錄,劃分的結果是基準左邊的子區間為空(或右邊的子區間為空),而劃分所得的另一個非空的子區間中記錄數目,僅僅比劃分前的無序區中記錄個

2.資料結構演算法——演算法時間複雜

定義 在進行演算法分析時,語句總的執行次數T(n)時關於問題規模n的函式,進而分析T(n)隨n的變化情況並確定T(n)的數量級。演算法的時間複雜度,也就是演算法的時間度量,記作:T(n) = O(f(n))。它表示歲問題規模n的增大,稱作演算法的漸進時間複雜度,簡稱為時間複雜度

排序的JAVA實現及時間複雜分析

堆排序是一個比較常用的排序方式,下面是其JAVA的實現: 1. 建堆 // 對輸入的陣列進行建堆的操作 private static void buildMaxHeap(int[] array, int length) { // 遍歷所有

C語言八大排序演算法(包括穩定性、時間複雜等)(收藏)

C語言八大排序演算法 概述 排序有內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。我們這裡說說八大排序就是內部排序。 當n較大,則應採用時間複雜度為O(nlog2n)的排序方法:快速排序、堆排

排序 查詢 樹 圖 的時間複雜

查詢演算法 時間複雜度 順序查詢 O(n) 演算法簡單,適應面廣,穩定演算法 折半查詢 O(log2n) 針對有序的序列表,不穩定 分塊查詢 介於順序查詢和折半查詢之間 針對有序表,不穩定演算法 平

拓撲排序(topological sorting)時間複雜

AOV網路  在有向圖中,用頂點表示活動,用有向邊<Vi, Vj>表示活動Vi必須先於活動Vj進行。這種有向圖叫作頂底表示活動的網路(Active on vertices),記作AOV網路。   在AOV網路中,如果活動Vi必須在Vj之前進行,則存在有向邊<

八大排序演算法JAVA實現(時間複雜O(n-logn)篇)

本文講述時間複雜度為n*logn的排序演算法:歸併排序、快速排序、堆排序以及希爾排序的原理、Java實現以及變形應用。 一、歸併排序  原理:把兩個有序數列合併為一個有序數列。需遞迴實現。  Java實現: 1 public int[] mergeSort(in

八大排序演算法JAVA實現(時間複雜O(n-n)篇)

本文主要描述3個時間複雜度為n2的排序演算法:氣泡排序、選擇排序、插入排序。 1.氣泡排序:由陣列頭部開始,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。每次交換完成後,當前陣列最大值就會被放在最後。 1 public int[] bubbleSort

演算法入門:斐波那契數列演算法的時間複雜

此處使用三種方式實現斐波那契數列:遞迴、遞推和通項公式。 實現過程如下: #include<cstring> #include<cstdio> #include<iostream> #include<cmath> usin

有1,2...一直到n的無序陣列,求排序演算法,並且要求時間複雜為O(n),時間複雜為O(1)

提示:用陣列值作為下標 分析:        對於一般陣列的排序顯然 O(n) 是無法完成的。       既然題目這樣要求,肯定原先的陣列有一定的規律,讓人們去尋找一種機會。 例如:原始陣列:           a = [ 10, 6,9, 5,2

有 n 個無序整數,則找出其中大的 M 個數字所需要的時間複雜

有 n 個無序整數( n>10000), 則找出其中最大的 M 個數字(5< M<10), 所需要的最小時間複雜度: 看了很多部落格和論壇,這道題我找到了兩種方法,在這裡總結一下。 兩種方法都用到了堆排序,那麼首先回顧一下堆排序:

算法系列-複雜分析:淺析最好、平均、均攤時間複雜

整理自極客時間-資料結構與演算法之美。原文內容更完整具體,且有音訊。購買地址: 上一節,我們講了複雜度的大 O 表示法和幾個分析技巧,還舉了一些常見覆雜度分析的例子,比如 O(1)、O(logn)、O(n)、O(nlogn) 複雜度分析。掌握了這些內容,對於複雜度分析這個知識點,你已經

最好,平均,均攤時間複雜

// n 表示陣列 array 的長度int find(int[] array, int n, int x) {  int i = 0;  int pos = -1;  for (; i < n; ++i) {    if (array[i]

Chapter4 複雜分析(下):淺析最好,,平均,均攤時間複雜

四個複雜度分析: 1:最好情況時間複雜度(best case time complexity) 2:最壞情況時間複雜度(worst case time complexity) 3:平均情況時間複雜度(average case time complexity) 4:均攤時間複雜度(amortized t