冒泡排序选择排序插入排序桶排序

冒泡排序

原理: 从左到右,相邻元素进行比较,按照排序要求进行位置交换。每次比较一轮,就会确定好序列中最大或最小的一个数。这个数就会从序列的最右边冒出来。

  1. 随机给出一组数字,降序输出这组数字。
  2. 采用双重for循环,外层循环枚举气泡的位置:n-2;
  3. 内层循环未排序的数据:i-1
  4. swap(a,b) 内置的交换函数
#include<bits/stdc++.h>
using namespace std;
int main(){       //降序 
    int n;
    cin>>n;
    int a[100];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
     } 
    for(int i=n;i>=2;i--)
    {

        for(int j=1;j<=i-1;j++)
        {

            if(a[j]<a[j+1])
            {

                swap(a[j],a[j+1]);
            }

        }

    }
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
     } 

 return 0;
}

上面的方法不管数组什么时候已经排好序,都要n-1次才能排完,可以设置一个布尔变量,如果遍历某次不再有数据交换,证明数组已经有序,则不再进行比较,进而减少几趟排序。

#include<bits/stdc++.h>
using namespace std;
int main(){       //降序 
    int n;
    cin>>n;
    int a[100];
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
     } 
    for(int i=n;i>=2;i--)
    {
        bool flag=true;  //定义布尔型变量进行标记
        for(int j=1;j<=i-1;j++)
        {

            if(a[j]<a[j+1])
            {
                flag=false;
                swap(a[j],a[j+1]);
            }

        }
        if(flag==true)  //如果遍历某次不再有数据交换,证明已经有序,则可以退出循环
        {    break;
        }
    }
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
     } 

 return 0;
}

选择排序

原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。即每次选择最大或最小的数放好

  1. 双重循环,外循环定位到还没定下来的宽度/位置
  2. 内循环遍历比较还没确定位置的数
  3. 先让第一个数作为最大(小)的数,再去进行比较
#include<iostream>
using namespace std;  //升序,从小到大 
int main()
{
    int a[100];
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
     } 
    for(int i=1;i<=n-1;i++)
    {
        int min=i;
        for(int j=i+1;j<=n;j++)
        {
            if(a[j]<a[min]){
                min=j;
            }
        }
        if(a[i]!=a[min])
        {
            int temp=a[i];
            a[i]=a[min];
            a[min]=temp;
        }
    }
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
     } 
    return 0;
}

插入排序

  1. 从第一个元素开始,该元素可以认为已经被排序。
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描。
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置。
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
  5. 将新元素插入到该位置后。
  6. 重复步骤2~5。
#include<iostream>
using namespace std;        
int main()               // 从小到大排 
{
    int n;
    int a[100];
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
     } 

    for(int i=2;i<=n;i++)
    {
        int key = a[i];
        int j = i - 1;
        while (j >= 1 && a[j] > key) {
            a[j + 1] = a[j];
            j = j - 1;
        }
        a[j + 1] = key;
    }
    for(int i=1;i<=n;i++)
    {
        cout<<a[i]<<" ";
     }

    return 0;
}

桶排序

桶排序(Bucket sort):如果需要排序的数据在一个明显有限范围内(整型)时,我们可以用数组下标与数值一一对应,将每个数值放进与它对应的数组元素(桶)中,然后按照顺序输出各桶的值,将得到有序的序列。

有n个正整数,数字范围在1~10000之间,请你将这n个数字从小到大输出。
【输入描述】第一行一个正整数n,接下来一行n个数字。(n不超过500000) 【输出描述】从小到大输出这n个数字,

【输入样例】5 2 3 4 6 3 【输出样例】23346

#include<bits/stdc++.h>
using namespace std;
int a[10001];  //定义足够长的数组长度 
int main(){

    int n,t;  // n为有多少个数,t为输入的具体数字
    cin>>n;  
    for(int i=1;i<=n;i++)
    {
        cin>>t;
        a[t]++;
    }

    for(int i=1;i<=10000;i++)   //遍历整个数组,上限是题目要求的数字的最大范围
        for(int j=1;j<=a[i];j++)
        {
            cout<<i<<" ";
        }

 return 0;
}

学校推出10名歌手,校学生会想知道这10名歌手受欢迎的程度,设计一个投票箱,让每一个同学给自己喜欢的歌手投票,为了方便,校学生会把10名歌手用1-10进行编号,这样,同学们只要用编号进行投票,现在校学生会找到你,让你帮忙统计一下每个歌手获得的票数。
【输入】两行,第一行是一个整数n,表示参加投票的人数,第二行是n个整数,每个数的取值的范围为[1-10],表示喜欢的歌手

【输出】两行,第一行为1-10个数字,表示选手编号,第二行10个数字表示各个选手获得的票数

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    int t;
    int a[11]={0};
    for(int i=1;i<=n;i++)
    {
        cin>>t;
        a[t]++;
     } 
     cout<<"1 2 3 4 5 6 7 8 9 10"<<endl;
     for(int i=1;i<=10;i++){
         cout<<a[i]<<" ";
     }

 return 0;
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值