冒泡排序和直接插入排序

本文介绍了两种基本排序算法——冒泡排序和直接插入排序。冒泡排序通过不断交换相邻的逆序元素将最大值逐步推至末尾,而直接插入排序则是将新元素在已排序部分中找到合适位置插入。文章提供了两个算法的题目链接及详细代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序

题目链接:http://47.96.116.66/problem.php?cid=2082&pid=9

题目大意:对n个数排序

排序思想:每次操作吧最大的数移到最后,然后之后不管那个数,处理前n-1个。重复此操作

代码:

/*
我的想法是从小到大排,总共进行n次,首先处理0~n-1将最大数逐渐换到最后一位,然后处理0~n-2,将第二大的数放到倒数第二位....依此类推

对于每一层,比方说第一层,我们是怎么把最大的数放到最后一位的呢?
我们从左开始遍历,每次处理相邻的两个数,如果右边比左边小,就把左边的数换到右边,这样是不是就能把最大的数换到右边了?

冒泡最坏情况:排序 5 4 3 2 1,
*/

#include<stdio.h>
 
int main()
{
    int n;
    while (scanf("%d",&n)!=EOF){
        int a[100];

        for (int i=0;i<n;i++) scanf("%d",&a[i]);//输入
    
        for (int i=0;i<n;i++){//i表示进行第几次
            for (int j=0;j<n-1-i;j++){//表示需要遍历到的位置
                if (a[j]>a[j+1]){
                    int t = a[j];
                    a[j] = a[j+1];
                    a[j+1] = t;
                }
            }
        }

        for (int i=0;i<n;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
    }
    return 0;
}

直接插入排序

题目链接:http://47.96.116.66/problem.php?cid=2082&pid=13

题目大意:对n个数从小到大插入排序,并输出排序过程中的比较次数。

排序思想:每新增一个数,在已有数组中找到对应位置(即比前一个大比后一个小的位置)并放入。

代码:

/*
本题插入排序的思路:当前要插入的数x,去遍历当前数组,从右往左(当然可以从左往右但是题目样例的三次是从右往左才能计算出来)
找到第一个大于等于的位置把这个位置之后(不包括该位置)的元素往后挪一个,把当前x放进去
*/

#include<stdio.h>

int main()
{
    int t,n,a[2000];
    scanf("%d",&t);
    for (int tt=1;tt<=t;tt++){

        scanf("%d",&n);

        scanf("%d",&a[0]);

        int ans = 0;

        for (int i=1;i<n;i++){
            int x,idx = 0;//idx表示当前x要在的位置,由于下一个数在已有数组中从右往左找,所以初始化为最坏情况0
            scanf("%d",&x);
            for (int j=i-1;j>=0;j--){
                ans++;
                if (x>=a[j]) {//找要找到第一个>=的位置,那么插在这个数后面即可。找到位置并直接退出
                    idx = j+1;
                    break;
                }
            }

            for (int j=i-1;j>=idx;j--){//都右移,把idx这个位置腾出来
                a[j+1] = a[j]; 
            }

            a[idx] = x;
        }

        printf("%d\n",ans);
        for (int i=0;i<n;i++) printf("%d ",a[i]);
        printf("\n");
    }
    return 0;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值