C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)

 冒泡法排序:顾名思义,小的数据就好像水中的气泡一样总是逐渐往上升,
大的数据就像石块一样往下沉,因此称为冒泡法排序法。

假如有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;
}//这种方法比交换法更简便,交换次数更少

 以上就是最基本的:三种排序

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月8日
下一篇 2023年12月8日

相关推荐