冒泡排序
原理:
冒泡排序的基本思想就是不斷比較相鄰的兩個數(shù)悼枢,讓較大的元素不斷地往后移埠忘。經(jīng)過一輪比較,就選出最大的數(shù)馒索;經(jīng)過第2輪比較莹妒,就選出次大的數(shù),以此類推绰上。
下面以對 3 2 4 1 進(jìn)行冒泡排序說明旨怠。
第一輪 排序過程
3 2 4 1 (最初)
2 3 4 2 (比較3和2,交換)
2 3 4 1 (比較3和4蜈块,不交換)
2 3 1 4 (比較4和1鉴腻,交換)
第一輪結(jié)束,最大的數(shù)4已經(jīng)在最后面百揭,因此第二輪排序只需要對前面三個數(shù)進(jìn)行再比較拘哨。
第二輪 排序過程
2 3 1 4 (第一輪排序結(jié)果)
2 3 1 4 (比較2和3,不交換)
2 1 3 4 (比較3和1信峻,交換
第二輪結(jié)束倦青,第二大的數(shù)已經(jīng)排在倒數(shù)第二個位置,所以第三輪只需要比較前兩個元素盹舞。
第三輪 排序過程
2 1 3 4 (第二輪排序結(jié)果)
1 2 3 4 (比較2和1产镐,交換)
至此隘庄,排序結(jié)束。
下面直接上代碼:
int main(){
int num[10] = {3,0,1,8,7,2,5,4,9,6};
for(int i = 1; i < 10; i++){//控制總共遍歷次數(shù)
//開始每一次遍歷 找到一個最大的數(shù)沉底
for(int j = 0; j < 10-i; j++){
//讓j和j+1的值進(jìn)行比較
if(num[j] > num[j+1]){
//交換j和j+1的值
int temp = num[j];
num[j] = num[j+1];
num[j+1] = temp;
}
}
}
//輸出
for(int i = 0; i < 10; i++){
printf("%d ", num[i]);
}
return 0;
}
選擇排序
原理:
選擇排序(從小到大)的基本思想是癣亚,首先丑掺,選出最小的數(shù),放在第一個位置述雾;然后街州,選出第二小的數(shù),放在第二個位置玻孟;以此類推唆缴,直到所有的數(shù)從小到大排序。
在實現(xiàn)上黍翎,我們通常是先確定第i小的數(shù)所在的位置面徽,然后,將其與第i個數(shù)進(jìn)行交換匣掸。
下面趟紊,以對 3 2 4 1 進(jìn)行選擇排序說明排序過程,使用min_index 記錄當(dāng)前最小的數(shù)所在的位置碰酝。
第1輪 排序過程 (尋找第1小的數(shù)所在的位置)
3 2 4 1(最初霎匈, min_index=1)
3 2 4 1(3 > 2, 所以min_index=2)
3 2 4 1(2 < 4送爸, 所以 min_index=2)
3 2 4 1(2 > 1唧躲, 所以 min_index=4, 這時候確定了第1小的數(shù)在位置4)
1 2 4 3 (第1輪結(jié)果碱璃,將3和1交換弄痹,也就是位置1和位置4交換)
第2輪 排序過程 (尋找第2小的數(shù)所在的位置)
1 2 4 3(第1輪結(jié)果, min_index=2嵌器,只需要從位置2開始尋找)
1 2 4 3(4 > 2肛真, 所以min_index=2)
1 2 4 3(3 > 2, 所以 min_index=2)
1 2 4 3(第2輪結(jié)果爽航,因為min_index位置剛好在第2個位置蚓让,無需交換)
第3輪 排序過程 (尋找第3小的數(shù)所在的位置)
1 2 4 3(第2輪結(jié)果, min_index=3讥珍,只需要從位置2開始尋找)
1 2 4 3(4 > 3历极, 所以min_index=4)
1 2 3 4(第3輪結(jié)果,將3和4交換衷佃,也就是位置4和位置3交換)
至此趟卸,排序完畢。
依舊話不多說直接上代碼:
int main(){
//選擇排序
int num[10] = {3,0,1,8,7,2,5,4,9,6};
for(int i = 0; i < 10-1; i++){//控制次數(shù)
//取出i對應(yīng)的數(shù),默認(rèn)是最小的數(shù)
int temp = num[i];
//從i后面開始查找當(dāng)前最小的數(shù) 放到i的位置
for(int j = i+1; j < 10; j++){
//讓temp和i后面的每個數(shù)進(jìn)行比較
//temp始終保存最小的那個數(shù)
if(num[j] < temp){
//交換
int n = temp;
temp = num[j];
num[j] = n;
}
}
//當(dāng)前的temp值是最小的锄列,寫入i對應(yīng)的位置
num[i] = temp;
}
//輸出
for(int i = 0; i < 10; i++){
printf("%d ", num[i]);
}
return 0;
}
插入排序
原理:
插入排序的基本思想是图云,將元素逐個添加到已經(jīng)排序好的數(shù)組中去,同時要求邻邮,插入的元素必須在正確的位置竣况,這樣原來排序好的數(shù)組是仍然有序的。
在實際使用中筒严,通常是排序整個無序數(shù)組丹泉,所以把這個無序數(shù)組分為兩部分排序好的子數(shù)組和待插入的元素。第一輪時鸭蛙,將第一個元素作為排序好的子數(shù)組摹恨,插入第二個元素;第二輪规惰,將前兩個元素作為排序好的數(shù)組睬塌,插入第三個元素泉蝌。以此類推歇万,第i輪排序時,在前i個元素的子數(shù)組中插入第i+1個元素勋陪。直到所有元素都加入排序好數(shù)組贪磺。
下面,以對 3 2 4 1 進(jìn)行選擇排序說明插入過程诅愚,使用j記錄元素需要插入的位置寒锚。排序目標(biāo)是使數(shù)組從小到大排列。
第1輪
[ 3 ] [ 2 4 1 ] (最初狀態(tài)违孝,將第1個元素分為排序好的子數(shù)組刹前,其余為待插入元素)
[ 3 ] [ 2 4 1 ] (由于3>2,所以待插入位置j=1)
[ 2 3 ] [ 4 1 ] (將2插入到位置j)
第2輪
[ 2 3 ] [ 4 1 ] (第1輪排序結(jié)果)
[ 2 3 ] [ 4 1 ] (由于2<4雌桑,所以先假定j=2)
[ 2 3 ] [ 4 1 ] (由于3<4喇喉,所以j=3)
[ 2 3 4 ] [ 1 ] (由于4剛好在位置3,無需插入)
第3輪
[ 2 3 4 ] [ 1 ] (第2輪排序結(jié)果)
[ 2 3 4 ] [ 1 ] (由于1<2校坑,所以j=1)
[1 2 3 4 ] (將1插入位置j拣技,待排序元素為空,排序結(jié)束)
還是直接代碼伺候吧:
int main(){
//插入排序
int num[10] = {3,0,1,8,7,2,5,4,9,6};
for(int i = 0; i < 10-1; i++){//控制次數(shù)
//判斷i和i+1的大小
if(num[i] > num[i+1]){
//換位置
int temp = num[i];
num[i] = num[i+1];
num[i+1] = temp;
//讓i對應(yīng)的值和前面所有的值進(jìn)行比較
for (int j = i; j > 0; j--){
//j和j-1進(jìn)行比較
if(num[j] > num[j-1]){
//當(dāng)前這個位置就是這個數(shù)字的位置
break;
} else{
//j和j-1換位置
int temp = num[j];
num[j] = num[j-1];
num[j-1] = temp;
}
}
}
}
//輸出
for(int i = 0; i < 10; i++){
printf("%d ", num[i]);
}
return 0;
}