?冒泡法排序:顧名思義,小的數(shù)據(jù)就好像水中的氣泡一樣總是逐漸往上升, 大的數(shù)據(jù)就像石塊一樣往下沉,因此稱為冒泡法排序法。
假如有n個數(shù)字,則需要進行n-1輪?
第一輪結(jié)果:最大的數(shù),被放在了最后一位
?第二輪:元素 ‘8’ 已經(jīng)拍好了順序,所以只用將前4個元素進行排序
?第三輪:只用將前3個元素排序即可
?第四輪:只用將前2個元素比較即可
?第五輪:只剩下一個元素,直接放在首位,它一定是最小的
?以上就是冒泡排序的步驟
代碼如下:
/*冒泡法排序:字面意思為小的數(shù)據(jù)就好像水中的氣泡一樣總是逐漸往上升,
大的數(shù)據(jù)就像石塊一樣往下沉,因此稱為冒泡法排序法。
第一輪從a[0]到a[5]依次把兩個相鄰的元素兩兩比較;每次比較后,順序不對,
則交換兩個元素的值,否則不交換。*/
//利用冒泡排序法,對輸入的數(shù)據(jù)安升序排序
#include<stdio.h>
int main() {
int i, j, a[100], t;//數(shù)組元素的最大容量為100
int n;
printf("請輸入要排序的元素個數(shù):");
scanf("%d", &n);
printf("請輸入要排序的元素:");
for (i = 0; i < n ; i++) {
scanf("%d", &a[i]);//將數(shù)據(jù)放入數(shù)組中
}
/*核心部分:i屬于[0,n-1)即N-1次循環(huán);j屬于[0,n-1-i)*/
for (i = 0; i < n-1 ; i++) {//這里可以寫成:i<n;它表示意思是,進行n輪,最后一個沒排的元素由于不滿足j<n-i-1,因此不用比較,因為它一定是最小的
for (j = 0; j < n - i - 1; j++) {//i<n-1;它的意思是:進行n-1輪,最后一個元素與緊鄰右邊的元素再進行一次比較,這個過程可省略,因為它在上一輪結(jié)束后,已經(jīng)是比右邊的小了
if (a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
printf("排序之后為:");
for (j = 0; j < n; j++)
printf("%-3d", a[j]);
return 0;
}
?運行結(jié)果為:
?再來看交換法:
交換法排序:?交換法排序:
??????第一輪用a[0]依次與a[1],a[2],....進行比較,若次序不對就交換,否則不交換,本輪結(jié)束后,a[0]就是最小數(shù)。 ????????第二輪用a[1]與依次與a[2],a[3],.....交換,處理方法與第一輪相同。重復(fù)上述過程,至第N-1輪(N為排序的個數(shù)),采用二重 循環(huán),外循環(huán)變量i從0循環(huán)到N-2,共循環(huán)N-1次;內(nèi)循環(huán)變量j從i+1開始循環(huán)到N-1?
?代碼如下:
/*交換法排序:第一輪用a[0]依次與a[1],a[2],....進行比較,若次序不對就交換,否則不交換,本輪結(jié)束后,a[0]就是最小數(shù)。
第二輪用a[1]與依次與a[2],a[3],.....交換,處理方法與第一輪相同。重復(fù)上述過程,至第N-1輪(N為排序的個數(shù)),采用二重
循環(huán),外循環(huán)變量i從0循環(huán)到8,共循環(huán)9次;內(nèi)循環(huán)變量j從i+1開始循環(huán)到N-1*/
//從鍵盤輸入10個數(shù),按照升序排序,并輸出排序結(jié)果。
#include<stdio.h>
int main() {
int n;
int i, j, t, a[100];
printf("請輸入要排序的元素個數(shù):");
scanf("%d", &n);
printf("請輸入要排序的元素:");
for (j = 0; j < n; j++) {
scanf("%d", &a[j]);
}
/*核心部分:i屬于[0,n-1);j屬于[i+1,n)*/
for (i = 0; i < n-1; i++) {
for (j = i + 1; j < n; j++) {
if (a[i] > a[j]) {
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
printf("排序后為:");
for (j = 0; j < n; j++) {
printf("%-2d", a[j]);
}
return 0;
}
?運行結(jié)果為:
?
選擇法排序:(選擇法排序是交換法排序的改進版,兩個核心循環(huán)沒有發(fā)生變化)
????????是交換法排序的改進方法,在交換法中,用于排序的雙重循環(huán)中,每當(dāng)a[i]>a[j]時,就交換a[i],a[j], ????????實際上不需要每次都交換,只要增設(shè)一個變量k,用于記錄每次較小數(shù)的下標(biāo),只需要在本輪比較結(jié)束后,交換a[i],a[k]即可。
/*選擇法排序*/
#include<stdio.h>
int main() {
int i, j, t, k, a[100];
int n;
printf("請輸入要排序的元素個數(shù):");
scanf("%d", &n);
printf("請輸入要排序的元素:");
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
/*核心*/
for (i = 0; i < n - 1; i++) {
k = i;
for (j = i + 1; j < n; j++) {
if (a[k] > a[j]) {
k = j;
}
}if (i != k) { //即a[i]不是最小的,(已經(jīng)執(zhí)行過k=j;)將a[i]與后面最小的元素換位置
t = a[i];
a[i] = a[k];
a[k] = t;
}
}printf("排序后的數(shù)組為:");
for (i = 0; i < n; i++) {
printf("%-3d", a[i]);
}
return 0;
}//這種方法比交換法更簡便,交換次數(shù)更少
文章來源:http://www.zghlxwxcb.cn/news/detail-767966.html
?以上就是最基本的:三種排序文章來源地址http://www.zghlxwxcb.cn/news/detail-767966.html
到了這里,關(guān)于C語言入門:冒泡法排序、交換法排序和選擇法排序算法的詳解(代碼分析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!