冒泡法排序:顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升, 大的数据就像石块一样往下沉,因此称为冒泡法排序法。
假如有n个数字,则需要进行n-1轮
第一轮结果:最大的数,被放在了最后一位
第二轮:元素 ‘8’ 已经拍好了顺序,所以只用将前4个元素进行排序
第三轮:只用将前3个元素排序即可
第四轮:只用将前2个元素比较即可
第五轮:只剩下一个元素,直接放在首位,它一定是最小的
以上就是冒泡排序的步骤
代码如下:
/*冒泡法排序:字面意思为小的数据就好像水中的气泡一样总是逐渐往上升,
大的数据就像石块一样往下沉,因此称为冒泡法排序法。
第一轮从a[0]到a[5]依次把两个相邻的元素两两比较;每次比较后,顺序不对,
则交换两个元素的值,否则不交换。*/
//利用冒泡排序法,对输入的数据安升序排序
#include<stdio.h>
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<n-1;它的意思是:进行n-1轮,最后一个元素与紧邻右边的元素再进行一次比较,这个过程可省略,因为它在上一轮结束后,已经是比右边的小了
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;
}
运行结果为:
再来看交换法:
交换法排序: 交换法排序:
第一轮用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<stdio.h>
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 < 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;
}
运行结果为:
选择法排序:(选择法排序是交换法排序的改进版,两个核心循环没有发生变化)
是交换法排序的改进方法,在交换法中,用于排序的双重循环中,每当a[i]>a[j]时,就交换a[i],a[j], 实际上不需要每次都交换,只要增设一个变量k,用于记录每次较小数的下标,只需要在本轮比较结束后,交换a[i],a[k]即可。
/*选择法排序*/
#include<stdio.h>
int 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 < n; j++) {
if (a[k] > 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://www.toymoban.com/news/detail-767966.html
以上就是最基本的:三种排序文章来源地址https://www.toymoban.com/news/detail-767966.html
到了这里,关于C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!