c语言之比较,排序

冒泡排序法
冒泡排序法是一种排序算法,将数据进行有序的排列
如果为从小到大排列,流程如下:
首先进行第一趟排序,先对比第一个数和第二个数,将大的数放在第二个元素的为值上(交换),然后对比第二个数和第三个数,同样把大的数放在第三个位置上,以此类推,第一趟排序结束后最大的数放在最后一个位置上
然后进行第二趟排序,先对比第一个数和第二个数,把大的放在第二个数的位置上,然后对比第二个和第三个数,把大的放在第三个位置,一次类推,最后在倒数第二个位置放第二大数即可
直到所有的数据排序完毕。
如果有n个数,则需要执行n-1趟,并且每执行一次,下次比较次数会减一

例子:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int a[5] = {100,50,30,40,20};
    int i = 0,j = 0;
    int temp = a[0];
    //外层循环控制趟数,如果有n个数的,则执行n-1趟
    for(i = 1; i < 5; i++)
    {
   		 //先搞定一趟排序,利用冒泡排序将最大值放在最后一个数组的位置上
        for(j = 0; j < 5; j++)
        {
        	//取前一个数和后一个数进行对比,将大的数据放在后一个位置上
            if(a[j] > a[j + 1])
            {
                temp = a[j];
                a[j] = a[j + 1];
                a[j +1] = temp;
            }
        }
    }
    printf("排序后:\n:");
    for(i = 0; i < 5; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

运行结果:
排序后:
:20 30 40 50 100 

简单选择法排序
如果为从小到大排列,流程如下:
首先取第一个数与后面每一个数进行对比,如果某一个数比第一个数小,则交换位置,当第一次排序结束后,第一个位置放的是最小的数据
然后在拿第二个数与后面所有的数据进行对比,如果有比第二个数小的,则交换位置,当第二次排序结束后,第二个位置放的是第二小的数据,以此类推。

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int a[5] = {100,50,30,40,20};
    int i = 0,j = 0;
    int temp = a[0];
    
    //外层循环每次取出一个数据,然后交给内层循环进行对比
    for(i = 0; i < 5 - 1; i++)
    {
    	//内层循环从外层数据的下一个位置开始与外层取出的数据进行对比
        for(j = i + 1; j < 5; j++)
        {
        	//将小的放在外层取数的位置上
            if(a[i] > a[j])
            {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    printf("排序后:\n:");
    for(i = 0; i < 5; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    return 0;
}

运行结果:
排序后:
:20 30 40 50 100 

找出数组中第二大的值
流程如下:
两两比较,第二个跟第一个比较,记录下大的,再把小的数赋给定义的第二大,但是这样会出现一个问题,就是如果第三个数比第二个数小但是比第一个数大,这样比较仍然记录的第二大数仍然是第一个数,所以要再来一个if用来判断第一个数跟第三个数的大小
例子:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int a[5] = {100,50,30,40,20};
    int i = 0,j = 0;
    int max = a[0];
    int sec_max = 0;
    for(i = 1; i < 5; i++)
    {   
        if(a[i] > max)
        {
            sec_max = max;
            max = a[i];
        }
        else if(sec_max <= a[i])
        {
            sec_max = a[i];
        }
    }   
    printf("%d\n",sec_max); 
    return 0;
}

运行结果:
50
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值