O n 2 時間複雜度的演算法 學習筆記二

2021-09-12 11:22:56 字數 3132 閱讀 3973

wikipedia上的定義

氣泡排序(英語:bubble sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

按照上面的想法,對於n個待排列的資料,迴圈n次,每次從頭到尾比較兩兩比較一次。

外層迴圈:

for

(int i =

0; i < n; i++

)

內層迴圈:

for

(int j=

0; j < n; j++)if

(arr[j]

> arr[j+1]

)swap

(arr[j]

, arr[j+1]

);

由於我們每次迴圈都能把乙個最大的值移到它應該待的地方,所以內層迴圈不用遍歷整個陣列。

改進:

for

(int j=

0; j < n-i-

1; j++)if

(arr[j]

> arr[j+1]

)swap

(arr[j]

, arr[j+1]

);

最終實現:

void

bubblesort0

(int arr,

int n)

進一步考慮,上面實現的排序演算法,可以發現外層迴圈也是沒有必要遍歷整個陣列的,因為後面的陣列已經有序。最差的情況下,當乙個陣列就是有序陣列,上述演算法還是要執行與隨機數組相同的遍歷操作和比較操作,是沒有必要。當兩兩比較後沒有發生改變時,說明陣列就是有序的,外層迴圈終止即可。實現如下:

void

bubblesort1

(int arr,

int n)

n--;}

}

上面我們認為演算法每次迴圈將乙個值放大其合適的位置,那麼下一次迴圈中需要比較的次數就減少一次。

實際上當陣列相當有序的時候,一輪迴圈可能得到很大乙個有序部分,但是下一次迴圈中我們還對這些有序的部分進行比較操作。我們可以在上次發生交換的位置處就停止比較進入下一輪迴圈,減少沒有必要的比較。

void

bubblesort2

(int arr,

int n)

n = newn;}}

while

(newn >0)

;}

#include

#include

"sorttesthelper.h"

#include

"insertsionsort.h"

#include

"selectionsort.h"

void

bubblesort0

(int arr,

int n)

void

bubblesort1

(int arr,

int n)

n--;}

}void

bubblesort2

(int arr,

int n)

n = newn;}}

while

(newn >0)

;}intmain()

random array

bubblesort0

bubblesort1

bubblesort2

sectionsort

insertsort

10000

0.49

0.436

0.492

0.12

0.06

100000

45.067

45.201

46.318

11.926

6.023

1000000

4526.97

4548.36

4641.39

1210.82

611.774

nearly order array

bubblesort0

bubblesort1

bubblesort2

sectionsort

insertsort

10000

0.108

~0~0

0.117

~0100000

10.797

0.001

~0.001

11.971

~01000000

1095.83

0.002

0.004

1217.7

0.004

第乙個演算法bubblesort0和bubblesort1是按照原理描述寫的**。

每一輪將最大的值放大其應該排列的位置。

bubblesort0要執行n(n

−1)2

\frac

2n(n−1

)​。無論陣列是否有序程式總要對兩個數進行比較,知道迴圈結束;實際上當沒有發生資料交換的時候說明陣列已經是有序,就不需要比較下去。bubblesort1的改進就是基於這種情況,當沒有數交換時,停止程式。上面的**中能發現,對於隨機數組,效率並沒有提公升,可能是因為bubblesort1多了兩個賦值操作,而這些操作與bubblesort1中比較操作耗時差不多。對於近乎有序的陣列,改進的效果十分明顯。

氣泡排序的特點就是每次能夠找到乙個當前迴圈中最大的值,所以在下一迴圈,我們只需要考慮到上一次迴圈中最後一次發生交換的位置就行。就像bubblesort0第二層迴圈的結束條件。

從結果來看,對於隨機數組,效率並沒有得到很大的提公升,但是在幾乎有序的陣列中,效率也十分明顯。

前面實現了插入排序和選擇排序,這裡和氣泡排序做乙個對比。

對於隨機數組,氣泡排序的效能最差,插入排序最好;

對於幾乎有序的陣列,改進的氣泡排序能夠到達插入排序的效率。

liuyubobobo 演算法與資料結構

wikipedia

演算法學習(二)時間複雜度

1 什麼是大o o f n 表示執行演算法所需要執行的指令數,和f n 成正比 從圖中可以看出來n的差距是量級上的差距,可以看出來前面的常數可以忽略不計 不同複雜度的函式 在學術上來講o f n 表示演算法執行的上界 歸併排序複雜度是o nlogn 的,但同時也是o n 2 的,因為o表示時間的上界...

資料結構和演算法學習(2) 時間複雜度

借鑑自生活中 較大 較小 偏快 偏慢 等粗略的度量概念,在電腦科學中有一種粗略的度量方法稱之為 大o 表示法 這是一種可以描述演算法的速度如何與資料項的個數相聯絡的比較。無序陣列中新的資料項總是被放在下乙個有空的地方,無論資料項個數有多大,一次插入總是用相同的時間,這個時間可以表示為乙個常數,即用如...

演算法效率 1 時間複雜度 2 空間複雜度。

3 空間複雜度 1.演算法效率 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是...