選擇排序(selectionsort)
插入排序(insertsort)
氣泡排序類似於汽水的氣泡一樣,從杯子底部一直公升到杯子的頂部,在上公升過程中氣泡會逐漸變大,這一過程類似於讓一組資料從小到大排列。
從第乙個元素開始,與當前元素的相鄰元素進行比較,如果兩個元素之間逆序則交換,保證在比較完成後一組資料的最大元素在資料的結尾處,迴圈此步驟直到資料排列完成。
在流程圖中可以看出整個比較過程分為兩個部分,氣泡排序總流程
負責控制排序的完整性,依次相鄰比較流程
則負責在本次迴圈之內完成比較和交換的功能。
具體的動態演示圖如下所示:
上面的動畫效果表示一次迴圈排序的結果,如果要完成全部排序需要進行n-1
次。
template
<
class
t>
void
bubble_sort
(t _ar**,
int _argc)}}
}
#include
intmain
(int argc,
char
* ar**)
;bubble_sort
(test_data,6)
;return0;
}
冒泡演算法在各種條件(最好[基本有序]
、最壞[完全逆序]
和平均
)下基本相同的,都等於內層for迴圈的總迭代次數:
∑ i=
0n−2
(n−1
−i)=
n(n−
1)2=
o(n2
)\sum_^(n-1-i)==o(n^2)
i=0∑n−
2(n
−1−i
)=2n
(n−1
)=o
(n2)
這個演算法目前的缺點是不論後續結果是否已經有順序都會將外層迴圈執行完。
但是例如21, 37, 16, 53, 60, 62
這組資料,在進行2次外層迴圈之後就可以停止迴圈了,因此需要進行修改**如下:
template
<
class
t>
void
bubble_sort
(t _ar**,
int _argc)}if
(compare_flag)
}}
但這種改進起到的效果並不大,尤其是對於最壞的情況基本是沒有優化效果的。
選擇排序是先找到位置不合適的元素,再把它放到其最終的合適位置上,很明確地直接交換陣列元素。
選擇排序就是找到一組數列中最小的值放到第乙個元素,再從未排序的元素中找到最小的放到第二個元素,依此類推直到所有的元素都在正確的位置。
具體的動態演示圖如下所示:
}選擇演算法在最壞[完全逆序]
和平均
情況下基本相同的,複雜度如下:
∑ i=
0n−2
(n−1
−i)=
(n−1
)+(n
−2)+
(n−3
)=n(
n−1)
2=o(
n2)\sum_^(n-1-i)=(n-1)+(n-2)+(n-3)==o(n^2)
i=0∑n−
2(n
−1−i
)=(n
−1)+
(n−2
)+(n
−3)=
2n(n
−1)
=o(n
2)將陣列中的元素逐一與已排序好的資料進行比較,先將前兩個元素進行比較,再將第三個元素插入到適當位置。
插入排序先對第乙個元素array[0]和第二個元素array[1]進行排序,然後對array[2]進行排序,如果array[2]只小於array[1]則往移動1位,如果array[2]小於array[0]則往前移動2位,如果array[2]不小於前2位則原地不動。
具體的動態演示圖如下所示:
}插入演算法在最壞[完全逆序]
情況下複雜度如下:
∑ i=
1n−1
i=1+
2+..
.+n−
1=n(
n−1)
2=o(
n2)\sum_^i=1+2+...+n-1==o(n^2)
i=1∑n−
1i=
1+2+
...+
n−1=
2n(n
−1)
=o(n
2)
排序演算法c c
include void bubble sort1 int array,int arraysize int main void bubble sort1 array,5 排序好後為 1 2 3 4 5 int i for i 0 i 5 i printf d array i puts 以前做排序為了...
推排序演算法C C
在堆排序演算法中,我們使用的是最大堆。下面的 是給定一組數,構造乙個最大堆。left heap,location 和right heap,location 分別返回陣列heap中location的左右孩子的索引。max heapify heap,i 是確保heap陣列的i的左右孩子都滿足最大堆化。b...
C C 演算法 快速排序
氣泡排序的執行效率太低,因為每次比較相鄰的兩個數,所以時間複雜度為o n 花費的時間太長,所以為了更加的節省時間,提高程式的執行速率,我們可以採用快速排序。對於乙個數集,先把第乙個數當作基準數,然後分別從最右端和最左端向另一方向進行搜尋,以從小到大的順序為例 從右向左搜尋的,遇到比基準數小的與從左向...