1 汽泡排序法(Bubble Sort)︰如同汽泡由下逐漸往上升,越大的汽泡上升越快。
說明:
假設現有資料如下,欲將其由小排列至大。(若有N筆資料,則共需N-1回合)
小 => => => 排序方向 => => => 大
原始資料
第一回合
3
|
2
|
5
|
4
|
1
|
3比2大,故對調
|
2
|
3
|
5
|
4
|
1
|
3與5不變
|
2
|
3
|
5
|
4
|
1
|
5比4大,故對調
|
2
|
3
|
4
|
5
|
1
|
5比1大,故對調
|
2
|
3
|
4
|
1
|
5
|
5為最大值,排好了!
|
第二回合
2
|
3
|
4
|
1
|
5
|
2與3不變
|
2
|
3
|
4
|
1
|
5
|
3與4不變
|
2
|
3
|
4
|
1
|
5
|
4比1大,故對調
|
2
|
3
|
1
|
4
|
5
|
4為次大值,排好了!
|
第三回合
2
|
3
|
1
|
4
|
5
|
2與3不變
|
2
|
3
|
1
|
4
|
5
|
3比1大,故對調
|
2
|
1
|
3
|
4
|
5
|
3為第三大值,排好了!
|
第四回合,完成!
2
|
1
|
3
|
4
|
5
|
2比1大,故對調
|
1
|
2
|
3
|
4
|
5
|
2為第四大值,完成排序!
|
範例程式碼:
const int n=5;
int data[n]={3,2,5,4,1};
for(int i=0;i<n-1;i++) //共執行n-1回合
for(int j=0;j<n-1-i;j++) //每回合執行n-1-i次比較
if(data[j]>data[j+1]){ //如果左邊數字大於右邊數字,就進行交換
int tmp=data[j];
data[j]=data[j+1];
data[j+1]=tmp;
}
2 插入式排序法(Insertion Sort)︰
將未排序的數字往前插入到合適的位置,類似玩撲克牌時的整牌方式。
說明:
小===== 排序方向 ====>大
原始資料
第一回合
3
|
2
|
5
|
4
|
1
|
3,2對調
|
2
|
3
|
5
|
4
|
1
|
第一回合完成
|
第二回合
2
|
3
|
5
|
4
|
1
|
因5比3大,故3,5不變
|
2
|
3
|
5
|
4
|
1
|
第二回合完成
|
第三回合
2
|
3
|
5
|
4
|
1
|
5,4對調
|
2
|
3
|
4
|
5
|
1
|
因4比3大,故不必再調動
第三回合完成
|
第四回合,完成!
2
|
3
|
4
|
5
|
1
|
5,1對調
|
2
|
3
|
4
|
1
|
5
|
4,1對調
|
2
|
3
|
1
|
4
|
5
|
3,1對調
|
2
|
1
|
3
|
4
|
5
|
2,1對調
|
1
|
2
|
3
|
4
|
5
|
完成排序!
|
範例程式碼:
void insertion_sort(int data[],int size){
for(int i=1;i<size;i++){ //共執行size-1回合
int j=i-1;
while(j>=0&&data[j]>data[j+1]){
int tmp=data[j+1];
data[j+1]=data[j];
data[j]=tmp;
j=j-1;
}
}
}