資料結構與演算法之美 11 排序

2021-10-10 06:12:06 字數 2259 閱讀 2901

氣泡排序、插入排序、選擇排序、歸併排序、快速排序、計數排序、基數排序、桶排序。

1、演算法思想

2、**實現

3、演算法執行效率

插入排序和氣泡排序的時間複雜度相同,都是 o(n2),在實際的軟體開發裡,為什麼我們更傾向於使用插入排序演算法而不是氣泡排序演算法呢?

一、什麼是氣泡排序?

對一組資料進行排序,一次冒泡是依次比較相鄰的兩個資料,若滿足順序要求則不對元素進行交換,若不滿足排序要求,怎交換元素位置。

1、具有n個元素的一組資料,最多需要進行n次冒泡

2、每次冒泡需要進行n-1次比較

3、若某次冒泡中沒有發生元素的交換,說明這組資料已經有序,因此不需要繼續後面的冒泡

int

*bubble_sort

(int n,

int* a)

int tmp =0;

for(

int i =

0; i < n; n++)}

if(flag ==

false)}

return a;

}

二、氣泡排序的其他特性:

1、氣泡排序是原地排序,只需要常量級的臨時空間,所以它的空間複雜度為 o(1),是乙個原地排序演算法

2、氣泡排序是穩定排序,因為如果兩個元素相等不會發生交換

三、評估時間複雜度

氣泡排序的最好情況時間複雜度:o(n) , 元素有序的情況下

氣泡排序的最壞情況時間複雜度:o(n^2),倒序的情況下

氣泡排序的平均情況下的時間複雜度就是: o(n^2)

四、引入有序度、逆序度、滿有序度的概念評估平均情況時間複雜度:

有序度:一組元素中有序的元素對的個數

滿有序度:乙個完全有序的陣列的有序度 n*(n-1)/2

逆序度:一組資料排序後需要交換元素的次數

逆序度 = 滿有序度 - 有序度

一、什麼是插入排序?

首先我們將一組待排序的資料分為已排序區間和未排序區間。對於一組資料它的初始已排序區間只有乙個元素, 每次從未排序區間中拿出乙個元素插入到已排序區間,使得有序區間始終有序。直到未排序區間中的元素為空,排序結束。

int

*intertion_sort

(int n,

int a)

int value =0;

for(

int i =

1; i < n; i++

)else

} a[j +1]

= value;

}return a;

}

二、插入排序的一些特性

插入排序是原地排序,空間複雜度為o(1)

在插入排序中,對於值相同的元素,我們可以選擇將後面出現的元素,插入到前面出現元素的後面,這樣就可以保持原有的前後順序不變,所以插入排序是穩定的排序演算法。

三、插入排序的時間複雜度

最好情況時間複雜度: o(n) ,在資料有序的情況下,每次只需要比較一次就能找到插入點將後面的資料插入

最壞情況時間複雜度:o(n^2) 如果陣列是倒序的,每次插入都相當於在陣列的第乙個位置插入新的資料,所以需要移動大量的資料。

平均情況時間複雜度:還記得我們在陣列中插入乙個資料的平均時間複雜度是多少嗎?沒錯,是 o(n)。所以,對於插入排序來說,每次插入操作都相當於在陣列中插入乙個資料,迴圈執行 n 次插入操作,所以平均時間複雜度為 o(n^2)。

一、選擇排序的演算法思路

選擇排序演算法的實現思路有點類似插入排序,也分已排序區間和未排序區間。但是選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾。

int

*selection_sort

(int a,

int n)

}// 交換

int tmp =0;

tmp = a[i]

; a[i]

= a[min_idx]

; a[min_idx]

= tmp;

}return a;

}

二、選擇排序的時間複雜度

最好情況時間複雜度:o(n^2)

最壞情況時間複雜度:o(n^2)

平均情況時間複雜度:o(n^2)

三、選擇排序的其他特性

1、是原地排序

2、不是穩定排序

資料結構與演算法(九)排序

演算法 時間複雜度 平均 時間複雜度 最壞 時間複雜度 最好 空間複雜度 穩定性氣泡排序 o n 2 o n 2 o n o 1 穩定選擇排序 o n 2 o n 2 o n 2 o 1 不穩定插入排序 o n 2 o n 2 o n o 1 穩定希爾排序 o nlogn o n 2 o n o 1...

資料結構與演算法 四 排序

def heap sort li def heapfly li start len li 2 1 獲取最後乙個葉子節點的父節點 for nod in range start,1,1 left 2 nod 1 right min left 1,len li 1 temp left if li left...

資料結構 2 排序演算法

常見的排序演算法 氣泡排序 選擇排序 插入排序 歸併排序 快速排序 堆排序 includeusing namespace std void swap int a,int i,int j 冒泡法 平均時間複雜度 o n 2 void bubblosort int a,int n void bubblo...