排序算法之冒泡排序、選擇排序、插入排序的區別與聯繫

冒泡排序

(1)算法:

假如有N項數據。第一趟,將首項與第二項比較,較小者放在前面,較大者放後面,然後比較第二項和第三項,依次進行,第一趟結束,最大項排在最後一個位置;第二趟,比較前N-1項,將首項與第二項比較,較小者放在前面,較大者放後面,然後比較第二項和第三項,依次進行,第二趟結束,次大項排在倒數第二個位置;……,最後,排序結束。共進行N-1趟。

(2)時間複雜度:不考慮被排序數據的類型,算法時間複雜度:O( n^2 )

比較所需的時間:( N-1) + (N-2) +...+2+1 = N*(N-1) / 2= N^2 / 2

交換所需時間:每次交換視爲常數,平均交換時間爲 ( 0 + N^2 / 2)/ 2 = N^2 / 4

共需時間:N^2 / 2 + N^2 / 4 = 3* N^2 / 4

選擇排序

(1)算法:在冒泡排序上做了優化,減少了交換次數

假如有N項數據。第一趟,從N個數據中選出最小的那一項,放到第一個位置;第二趟,從第二個開始,共N-1個數據中選最小的,放到第二個位置;……;共進行N-1趟。

(2)時間複雜度:不考慮被排序數據的類型,算法時間複雜度:O( n^2 )

比較所需的時間:( N-1) + (N-2) +...+2+1 = N*(N-1) / 2= N^2 / 2

交換所需時間: (0 + (N-1))/ 2 = (N-1) / 2 

總時間:N^2 / 2 +(N-1)/ 2 

插入排序

(1)算法:

要求:在這個已經排好的數據序列中插入一個數,但要求插入後此數據序列仍然有序。

核心:始終定義第一個元素爲有序的,將元素逐個插入到有序排列之中,其特點是要不斷的移動數據,空出一個適當的位置,把待插入的元素放到裏面去。

思路:用一個臨時變量存放待排序的數字;從數組前依次遍歷找第一個比待排序數字大的數字的位置;將從待排序的數字位置開始,到找的要插入的數字的位置之間的數字向後挪一位,最後將待排序數字插入到找到的位置;

(2)時間複雜度:不考慮被排序數據的類型,算法時間複雜度:O( n^2 )

比較的時間:第一趟最多比較一次,第二趟最多比較倆次,最後一趟比較N-1次,最終,最多比較N*(N-1)/2趟;

交換的時間:與冒泡排序的時間相同,每次交換視爲常數,平均交換時間爲 ( 0 + N^2 / 2)/ 2 = N^2 / 4

總時間:N*(N-1)/2 + N^2 / 4

(3)區別:

和前兩個排序算法不同,插入排序在排序過程中是局部有序,隨着插入項的增多,有序部分的項的位置會發生改變,而冒泡排序和選擇排序每輪確定的項數的位置是永遠不變的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章