冒泡排序,选择排序,sort排序

一、冒泡排序(两个相邻的元素进行比较)

题目描述

本题要求将给定的n个整数从小到大排序后输出。(利用冒泡法进行排序)

输入:第一行给出一个不超过10的正整数n。第二行给出n个整数,其间以空格分隔。

输出:在一行中输出从小到大有序的数列,相邻数字间有一个空格,行末不得有多余空格。

输入样例:

5
3 5 6 1 2

输出样例:

1 2 3 5 6

完整代码如下

#include<stdio.h>
int a[15];
int main()
{
    int n,i,j,t;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]); 
    for(i=0;i<n-1;i++)//n个数,n-1趟 
    {
        for(j=0;j<n-i-1;j++)//次数 
        {
            if(a[j]>a[j+1])
            {
                t=a[j];
                a[j]=a[j+1];
                a[j+1]=t;
            }
        }
    }
    for(i=0;i<n-1;i++)
        printf("%d ",a[i]); 
    printf("%d",a[n-1]);
    return 0;
}

二、选择排序(当前的数和后面所有的数比较)

普通:

#include<stdio.h>
int a[15];
int main()
{
    int n,i,j,t;
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]); 
    for(i=0;i<n-1;i++)//n个数,n-1趟 
    {
        for(j=i+1;j<n;j++)//次数 
        {
            if(a[i]>a[j])
            {
                t=a[i];
                a[i]=a[j];
                a[j]=t;
            }
        }
    }
    for(i=0;i<n-1;i++)
        printf("%d ",a[i]); 
    printf("%d",a[n-1]);
    return 0;
}

优化:

#include<stdio.h>
int a[14];
int main()
{
    int n,i,j,t,min;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]); 
    }
    for(i=0;i<n-1;i++)
    {
        min=i;
        for(j=i+1;j<n;j++)
        {
            if(a[min]>a[j])
                min=j;
        }
        if(i!=min)
        {
            t=a[i];
            a[i]=a[min];
            a[min]=t;
        }
    }
    for(i=0;i<n-1;i++)
    {
        printf("%d ",a[i]); 
    }
    printf("%d",a[n-1]);
    return 0;
}

ps:例如【5 4 3 2 1】,3的位置没必要动

三、sort排序

一般形式:sort(start,end,排序方法)

头文件:#include<algorithm>

默认升序:

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[15];
int main()
{
    int n,i;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n);//注意
    for(i=0;i<n-1;i++)
        cout<<a[i]<<" ";
    cout<<a[n-1]<<endl;;
    return 0;
}

降序:

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int a[15];
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    int n,i;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n,cmp);//注意
    for(i=0;i<n-1;i++)
        cout<<a[i]<<" ";
    cout<<a[n-1]<<endl;;
    return 0;
}

ps:如果数组下标从1开始:

升序:sort(a+1,a+1+n)

降序:sort(a+1,a+1+n,cmp)

sort排序也还有其他用途~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 冒泡法排序是一种简单的排序算法,它的基本思想是通过不断比较相邻的两个元素,将较大的元素向后移动,较小的元素向前移动,从而实现排序。具体实现,需要进行n-1轮比较,每轮比较都将当前未排序的最大元素移动到最后一个位置。最终,所有元素都按照从小到大的顺序排列好了。 ### 回答2: 冒泡排序是一种简单的排序算法,其基本思想是通过相邻元素之间的比较和交换来实现排序。具体实现的过程是,将待排序的序列从头到尾依次遍历,每次比较相邻的两个元素,如果前一项比后一项大,则交换它们的位置。这样,一次遍历后,最大或最小的元素就会被置于序列的末尾或开头,然后再对剩余的序列进行相同的操作,直到整个序列有序为止。 在本题中,我们需要将给定的n个整数从小到大排序输出。因此,我们可以使用冒泡排序算法对这n个整数进行排序,并将排好序的结果输出即可。下面给出具体实现的步骤: 1. 遍历n次数组,每次数组长度减1。 2. 对于每次遍历,进行一次相邻元素的比较和交换,将大的元素往后移动。 3. 如果一次遍历没有进行任何交换,说明已经有序,可以结束循环,否则继续进行下一次的遍历。 在实现过程中,我们可以使用一个for循环来遍历n次数组,再使用嵌套的while循环来进行相邻元素的比较和交换。另外,我们可以在每次比较中设置一个flag标记来记录是否进行过交换,如果没有进行交换,则说明已经有序,可以结束循环。 代码实现如下: ```python n = int(input()) a = list(map(int, input().split())) for i in range(n): flag = 0 # 标记是否进行过交换 for j in range(n-i-1): if a[j] > a[j+1]: a[j], a[j+1] = a[j+1], a[j] flag = 1 if flag == 0: break for i in range(n): if i == n-1: print(a[i]) else: print(a[i], end=' ') ``` 以上代码实现了冒泡排序算法,并将排序后的结果输出到屏幕上。在此,我们需要注意一些细节问题,比如输入格式、输出格式、空格等。具体实现中,我们可以使用input()函数读取整数序列,并通过split()函数将其转换为列表;输出,需要使用print()函数,并设置end参数为一个空格以消除多余的空格。 ### 回答3: 对于冒泡排序,其实就是一种交换排序的方法。其核心思想是,每次比较相邻的两个元素,如果顺序不对,则将它们交换位置。通过多次比较和交换,让整个序列逐渐变得有序。具体实现方法如下: 1. 从序列的第一个元素开始,依次将相邻的两个元素进行比较,如果前一个元素比后一个元素大,则交换它们的位置。这样一次遍历之后,最后一个元素就是序列中最大的数。 2. 接着,从第一个元素开始重复上述操作,直到倒数第二个元素(因为最后一个元素已经是有序的了),将序列中第二大的数放在倒数第二个位置。 3. 不断地重复上述过程,直到所有元素都排好序为止。 在冒泡排序的过程中,我们需要记录两个变量:一是序列中的最后一个未排序的元素的位置,二是当前遍历的区间的右端点位置。每次遍历,右端点位置都会减少1,因为已经确定的位置上的数是排好序的,不需要再进行比较和交换了。 最终得到的序列就是按照从小到大的顺序排列的。输出,只需要依次输出每个数,中间用一个空格隔开即可。需要注意的是,行末不得有多余空格,否则可能会被认为是错误的输出格式。 总之,冒泡排序虽然算法复杂度较高,但实现起来比较简单,也很容易理解。它在工程实践中应用广泛,常用于小规模数据的排序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值