c语言数的排序问题(起泡法)

排序方法是一种重要的,基本的算法。起泡法的基本思路是:每次将相邻的两个数进行比较,将小的调到前面。若有六个数:9,8,5,4,2,0,可以按照下图方式进行对调排序。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkBYdXhxMDE,size_20,color_FFFFFF,t_70,g_se,x_16

第一趟比较先将第一个数9与第二个数8对调,再将第二个数9与第三个数5对调,进行五此后可以得到854209,最大的9已“沉底”,最小的数0已“浮起”。然后第二趟比较再将余下的五个数进行新一轮比较。按照规律进行下去n个数比较n-1次比较,n个数比较时第m趟需要n-m次比较,这种如水底的旗袍冒出水面一样的方法称为起泡法。

我们可以根据此画出流程图并据此写出程序(设n=10)

#include <stdio.h>
int main()
{
	int a[10];
	int n,m,k;
	printf("input 10 numbers:\n");
	for(n=0;n<10;n++)
		scanf("%d",&a[n]);
	for(m=0;m<9;m++)                               //进行九次循环,实现九次比较
		for(n=0;n<9-m;n++)                         //在每次循环中进行9-m次比较
			if(a[n]>a[n+1])                        //相邻两数比较
			{
				k=a[n];a[n]=a[n+1];a[n+1]=k;       //将大的数放到后面
			}
	printf("the sorted numbers:\n");
	for(n=0;n<10;n++)
		printf("%d ",a[n]);
	return 0;
}

输出结果:

 

程序分析:执行第一次外循环时,m=0,随后执行第一次内循环,此时n=0,在if语句中将a[0]与a[1]进行比较,执行第二次内循环将a[1]与a[2]进行比较,直到a[8]和a[9]比较后第一趟内循环结束,进行第二次外循环,以此类推。

同样的,我们也可以使用起泡法对字符进行排序

#include <stdio.h>
#include <string.h>
#define N 10
char str[N];
int main()
{
	void sort(char[]);                                //声明函数
	int i,flag;
	for(flag=1;flag==1;)
	{
		printf("input string:\n");
		gets(str);
		if(strlen(str)>N)
		    printf("string too long,input again!");
		else
		    flag=0;                                   //退出循环体
	}
	sort(str);
	printf("string sorted:\n");
	for(i=0;i<N;i++)
	    printf("%c",str[i]);
	printf("\n");
	return 0;
}

void sort(char str[])
{int i,j;
char t;
for(j=1;j<N;j++)                                      //与上例相同
    for(i=0;i<N-j;i++)
        if(str[i]>str[i+1])
        {t=str[i];
        str[i]=str[i+1];
        str[i+1]=t;
		}
}

输出结果:

这就是起泡法的大致流程,排序的算法有很多,重要的是要了解和掌握解题思路,学会分析问题,建立算法,以及如何利用c语言的编程的技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值