数据排序

1.选择排序

(1) 基本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。

(2)排序过程:

【示例】:

初始关键字 [49 38 65 97 76 13 27 49]

第一趟排序后 13[38 65 97 76 49 27 49 ]

第二趟排序后 13 27[65 97 76 49 38 49]

第三趟排序后 13 27 38 [97 76 49 65 49]

第四趟排序后 13 27 38 49 [76 97 65 49]

第五趟排序后 13 27 38 49 49 [97 65 76]

第六趟排序后 13 27 38 49 49 65 [97 76]

第七趟排序后 13 27 38 49 49 65 76 [97]

最后排序结果 13 27 38 49 49 65 76  97

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=10001;
int main()
{
    int n,k,i,j;
    float temp,a[MAXN];
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];            //输入n个数
    for(i=0;i<n;i++)            //i控制当前序列中最小值存放的数据位置
    {
        k=i;
        for(j=i+1;j<n;j++)   //在当前无序区a[i..n]中选最小的元素a[k]
            if(a[j]<a[k]) k=j;
        if(k!=i)             //交换a[i]和a[k],将当前最小值放到a[i]位置
        {
            temp=a[i];a[i]=a[k];a[k]=temp;
        }
    }
    for(i=0;i<n;i++)
        cout<<a[i]<<" ";
    return 0;
}
2.冒泡排序

(1)基本的冒泡排序

 ①基本思想

依次比较相邻的两个数,把大的放前面,小的放后面。即首先比较第1个数和第2个数,大数放前,小数放后。然后比较第2个数和第3个数......直到比较最后两个数。第一趟结束,最小的一定沉到最后。重复上过程,仍从第1个数开始,到最后第2个数,然后......

由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序。

代码如下:

for(int i=1;i<=n-1;++i)
    for(int j=1;j<=n-i;++j)
        if(a[j]>a[j+1])
           swap(a[j],a[j+1]);

3.桶排序

桶排序的思想是若待排序的记录的关键字在一个明显有限范围内(整型)时,可设计有限个有序桶,每个桶装入一个值(当然也可以装入若干个值),顺序输出各桶的值,将得到有序的序列。

例:输入n个0到100之间的不相同整数,由小到大排序输出。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int b[101],k,i,n;
    memset(b,0,sizeof(b));    //数组初始化
    cin>>n;
    for(i=1;i<=n;i++)
    {
        cin>>k;
        b[k]++;            //将关键字等于k的值全部装入第k桶
    }
    for(i=0;i<=100;i++)
        while(b[i]>0)
        {
            cout<<i<<" ";
            b[i]--;      //输出排序结果
        }
    cout<<endl;
    return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值