普通冒泡+改进版冒泡(SDUT1196-排序问题)+从1开始的冒泡循环(SDUT1569-选夫婿1)(这个相对最重要)

冒泡排序的原理是把一个数固定到合理的位置,他的前边都是比他小的,后边都是比他大的(或者恰恰相反),这样就能一个一个的固定每个数的位置,实现有序。
在这里插入图片描述

从0开始的冒泡排序,原始版,初学版

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b,i,c,n,j,t;
    scanf("%d",&n);
    int sum[n];
    for(i=0; i<=n-1; i++)
    {
        scanf("%d %d %d",&a,&b,&c);
        sum[i]=a+b+c;
    }
    for(i=0; i<=n-2; i++) //需要比较除它之外的值,所以i<=n-1-1,第二个1为它本身
    {
        for(j=0; j<=n-2-i; j++) //比较除他本身和已比较的i之外的所有值
        {
            if(sum[j]<sum[j+1])
//如果sum(j+1)>sum(j),把sum(j+1)的值和sum(j)的值交换,即把大数放到前面
//sum[j]<sum[j+1]格式不能倒置,不能写成sum[j+1]<sum[j],但可以写成sum[j]>sum[j+1]
            {
                t=sum[j];
                sum[j]=sum[j+1];
                sum[j+1]=t;
            }
        }
    }
    for(i=0; i<=n-1; i++)
    {
        printf("%d\n",sum[i]);
    }
    return 0;
}

从1开始的冒泡循环(以SDUT1569-选夫婿1为例)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>

struct yyh
{
    char a[25];
    int b;
    int c;

} a[100000],t;
int main()
{
    int i,n,j,e,f,c,d;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        scanf("%s %d %d",a[i].a,&a[i].b,&a[i].c);
    }
    scanf("%d %d %d %d",&e,&f,&c,&d);
    int flag=0;

    for(i=1; i<=n-1; i++)   //记好冒泡排序从1开始是<=n-1和下面的<=n-i;从0开始是<=n-2和<=n-2-i;
    {
        for(j=1; j<=n-i; j++)
        {
            if(a[j].b>a[j+1].b)
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
            if(a[j].b==a[j+1].b)
            {
                if(a[j].c>a[j+1].c)
                {
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
    }
    for(i=1; i<=n; i++)
    {
        if(e<=a[i].b&&a[i].b<=f&&c<=a[i].c&&a[i].c<=d)
        {
            printf("%s %d %d\n",a[i].a,a[i].b,a[i].c);
            flag=1;
        }
    }
    if(flag==0)
    {
        printf("No\n");
    }
    return 0;
}

改进版冒泡循环(以SDUT1196-排序问题为例)
在这里插入图片描述

package First;

import java.util.*;
public class Main
{
public static void main(String[] args)
{   int[] a=new int[15];
    int[] b=new int[15];
	Scanner in=new Scanner(System.in);
	for(int i=1;i<=10;i++)
	   {
		   a[i]=in.nextInt();
		   b[i]=i;
	   }
    change(a,b);
   for(int i=1;i<=10;i++)
   {
	   if(i!=10) System.out.printf("%d ",a[i]);
	   else System.out.printf("%d\n",a[i]);
   }
   for(int i=1;i<=10;i++)
   {
	   if(i!=10) System.out.printf("%d ",b[i]);
	   else System.out.printf("%d\n",b[i]);
   }
}
public static void change(int[] a,int[] b)
{
	
	   int t;
	   boolean sorted=true;
	   for(int i=1;i<=9&&sorted;i++) 
	   {
		   sorted=false;
		   for(int j=1;j<=10-i;j++)
		   {
			   if(a[j]>a[j+1])
			   {
				   t=a[j];
				   a[j]=a[j+1];
				   a[j+1]=t;
				   
				   t=b[j];
				   b[j]=b[j+1];
				   b[j+1]=t;
				   
				   sorted=true;
			   }
		   }
	   }
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值