C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)
•
算法结构
冒泡法排序:顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升,
大的数据就像石块一样往下沉,因此称为冒泡法排序法。
假如有n个数字,则需要进行n-1轮
第一轮结果:最大的数,被放在了最后一位

第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素进行排序

第三轮:只用将前3个元素排序即可

第四轮:只用将前2个元素比较即可

第五轮:只剩下一个元素,直接放在首位,它一定是最小的

以上就是冒泡排序的步骤
代码如下:
/*冒泡法排序:字面意思为小的数据就好像水中的气泡一样总是逐渐往上升,
大的数据就像石块一样往下沉,因此称为冒泡法排序法。
第一轮从a[0]到a[5]依次把两个相邻的元素两两比较;每次比较后,顺序不对,
则交换两个元素的值,否则不交换。*/
//利用冒泡排序法,对输入的数据安升序排序
#include
int main() {
int i, j, a[100], t;//数组元素的最大容量为100
int n;
printf("请输入要排序的元素个数:");
scanf("%d", &n);
printf("请输入要排序的元素:");
for (i = 0; i < n ; i++) {
scanf("%d", &a[i]);//将数据放入数组中
}
/*核心部分:i属于[0,n-1)即N-1次循环;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 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;
}
运行结果为:

再来看交换法:
交换法排序: 交换法排序:
第一轮用a[0]依次与a[1],a[2],….进行比较,若次序不对就交换,否则不交换,本轮结束后,a[0]就是最小数。
第二轮用a[1]与依次与a[2],a[3],…..交换,处理方法与第一轮相同。重复上述过程,至第N-1轮(N为排序的个数),采用二重
循环,外循环变量i从0循环到N-2,共循环N-1次;内循环变量j从i+1开始循环到N-1
代码如下:
/*交换法排序:第一轮用a[0]依次与a[1],a[2],....进行比较,若次序不对就交换,否则不交换,本轮结束后,a[0]就是最小数。
第二轮用a[1]与依次与a[2],a[3],.....交换,处理方法与第一轮相同。重复上述过程,至第N-1轮(N为排序的个数),采用二重
循环,外循环变量i从0循环到8,共循环9次;内循环变量j从i+1开始循环到N-1*/
//从键盘输入10个数,按照升序排序,并输出排序结果。
#include
int main() {
int n;
int i, j, t, a[100];
printf("请输入要排序的元素个数:");
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 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;
}
运行结果为:

选择法排序:(选择法排序是交换法排序的改进版,两个核心循环没有发生变化)
是交换法排序的改进方法,在交换法中,用于排序的双重循环中,每当a[i]>a[j]时,就交换a[i],a[j],
实际上不需要每次都交换,只要增设一个变量k,用于记录每次较小数的下标,只需要在本轮比较结束后,交换a[i],a[k]即可。
/*选择法排序*/#includeint main() { int i, j, t, k, a[100]; int n; printf("请输入要排序的元素个数:"); 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 a[j]) { k = j; } }if (i != k) { //即a[i]不是最小的,(已经执行过k=j;)将a[i]与后面最小的元素换位置 t = a[i]; a[i] = a[k]; a[k] = t; } }printf("排序后的数组为:"); for (i = 0; i < n; i++) { printf("%-3d", a[i]); } return 0;}//这种方法比交换法更简便,交换次数更少
以上就是最基本的:三种排序
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/75bd3790cf.html
