冒泡排序
(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)區別:
和前兩個排序算法不同,插入排序在排序過程中是局部有序,隨着插入項的增多,有序部分的項的位置會發生改變,而冒泡排序和選擇排序每輪確定的項數的位置是永遠不變的。