C语言:两种简单的排序及其应用(选择排序和冒泡排序)

在编程初学者的算法学习中,排序问题是可以经常见到的,简单的有两个数排序,或者三个数排序,当学习了数组之后,就会遇到多个数按照一定的顺序(如:升序)进行排序,并输出最终结果。比较简单的两个排序方法是选择排序和冒泡排序。下面一一介绍这两种排序的思路,并展示其编程代码。以数组 a[10]={ 2, 8, 5, 6, 4, 0, 9, 3, 1, 7 } 为例。

选择排序(以非递减排序为例):
思路:选定某一个位置上的数字,与位于其后面的数字进行大小比较。
例如:
选定第0位置的数字 2,与第1位置的数字 8 进行大小比较,因为 2<8,所以不进行位置交换;接下来 第0位置的数字 2与第2位置的数字 5 进行大小比较,因为 2<5,所以不进行位置交换;依此类推;当第0位置的数字 2 与第5位置的数字 0 比较时,因为 2>0,所以两数字交换位置,此时,第0位置的数字为 0,第5位置的数字为 2,此后,第0位置的数字 0 与剩下的数字比较,因为 0 是这10个数中最小的,所以最小的数固定于第0位置。此轮循环比较结束后,数组中的数字排列为{ 0, 8, 5, 6, 4, 2, 9, 3, 1, 7 }。
因为第0位置的数字在上一轮的比较过程中已经确定为所有数中的最小的数字,所以在此轮循环比较中,应选定第1位置的数与其后面的数字一一进行比较,按照上一轮的方法,循环比较结束后,数组中的数字排列为{ 0, 1, 8, 6, 5, 4, 9, 3, 2 , 7 }。
依此类推,进行9轮比较后,就可以使数组a中的数以正确的顺序输出。

下面为正确的代码展示:
#include<stdio.h>

int main()
{
	int i, j, n, t=0;
	int a[10]={2, 8, 5, 6, 4, 0, 9, 3, 1, 7};
	for(j=0; j<9; j++){
		for(i=j; i<9; i++){
			if(a[j]>a[i+1]){
				t=a[j];
				a[j]=a[i+1];
				a[i+1]=t;
			}
		}
	}
	for(n=0; n<10; n++){
		printf("%d",a[n]);
		if( n!=9 ) printf(" "); 
	}
	
	return 0;
}

冒泡排序(以非递减排序为例)
思路:每一轮循环比较,使这一轮循环中最大的数排到最后。(每轮循环中,比较的次数依次递减)
例如:在第1轮循环中,经过9次比较,使最大的数9排到本轮循环的最后,在第2轮循环中,经过8次比较,使前9个数中最大的数8排到本轮循环的最后(也就是数字 9 之前),依此类推。
下面为正确的代码展示:
#include<stdio.h>

int main()
{
	int a[10]={ 2, 8, 5, 6, 4, 0, 9, 3, 1, 7 };
	int i, j, n, t=0;
	
	for( i=0; i<10; i++ ){
		for( j=0; j<10-i; j++ ){
			if( a[j]>a[j+1] ){
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
		}
	}
	for( n=0; n<10; n++ ){
		printf("%d",a[n]);
		if(n!=9) printf(" ");
	}
	
	return 0;
}

应用:(选择排序)
此处以选择排序的应用推广为例。在做某些算法题时,你需要确定某些数字序列(或字符序列)中有没有相同的数字,此时就可以运用选择排序的思维,比较这些序列中的元素。
此部分代码只是思路的体现,请读者结合实际情况应用。代码如下:
#include<stdio.h>

int main()
{
	int a[10]={ 2, 8, 5, 6, 4, 2, 9, 3, 1, 7 };
	int i, j, t=0;
	for(i=9; i<9; i++){
		for(j=i+1; j<9; j++){
			if(a[i]!=a[j]){
				t=1;
				continue; 
			}else{
				t=0;
				break;
			}
		}
	}
	if(t==1)printf("序列中无重复元素\n");
	if(t==1)printf("序列中有重复元素\n");
	
	return 0;
}

以上所有内容就是两种排序的原理介绍以及应用推广。

如果读者觉得我的总结对您的学习有帮助,就劳烦您点一波关注吧!谢谢!

文章中无论有何错误,请读者朋友留言指正!谢谢!可怜

感谢读者朋友的阅读!
  • 13
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值