第十二周总结(排序)

一、桶排序
       即将要排序的数据放到一个数组内,将数组中的各个位置看作一个个的桶,然后将相应的数据放到相对应序号的桶内,这样数据就直接按照从小到大的顺序排列了,最后再按序循环输出就能达到排序的效果
下面是例题:
题目描述

有n个数,数的范围都在20以内(包括20),然后现在我要统计1-20分别出现的次数是多少

输入

多组输入
输入n(1<=n<=40)

输出

输出1-20分别出现多少
 

#include <stdio.h>
int main()
{
    int a[21], n, k;
    while(scanf("%d", &n)!=EOF)
    {
        for (int i = 0; i <= 20; i++)
        a[i] = 0;
        for (int j = 1; j <= n; j++)
        {
            scanf("%d", &k);
            a[k]++;
        }
        for (int i = 1; i <= 20; i++)
        {
            printf("%d:%d\n", i, a[i]);
        }
    }
    return 0;
}

首先定义了一个数组来储存这些要排序的数据,然后通过一个while循环来达到题目需要多组输入的要求。而while循环内又包含了三个for循环,第一个循环的作将数组初始化,第二个循环则是循环输入数据,同时输入对应数据就将数组中对应位置的数据加1,最后循环输出每个数据出现的次数。此题仅是应用了桶,而没有将数据进行排序。
将后面第三个循环改成一列代码即可实现排序

for(i=0;i<=21;i++)
    for(j=1;j<=a[i];j++)
        printf("%d",i);

这里是通过两层for循环的嵌套来输出排序后的数据。
注:此方法有一个缺点就是当对较大的数据排序时需要的内存会较大。

二、冒泡排序
       即每次将相邻的两个元素进行比较,如果顺序错误的话就将他们的顺序进行调换。这样将所有需要排序的数据比较一次下来至少能将最小(或最大)的那个数据送到他的位置,假如总共有N个数据,那么进行N-1次这样的比较过后就达到了排序的目的。由于每一次从头到尾的比较将此时最小(或最大)的元素送到相应位置的过程就像一个个泡泡从水下冒出来一样,故取名冒泡排序。

下面是例题:
 

题目描述

给定N个整数,请你对这些整数进行升序排列并输出。

输入

输入数据有多组,第一行是测试数据的组数T,接下的T行中,每行表示一组测试数据,每组测试数据的第一个数字为N(1<=N<=1000),接下来是N个整数。本题中,所有的整数都在32位之内。

输出

输出每组测试数据排序后的结果。每组测试数据占一行。
 

#include <stdio.h>

void swap(int a, int b, int arr[]) 
{
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}
 
void sel(int arr[], int n) 
{
    for (int i = 0; i < n - 1; i++) 
    {
        int min = i;
        for (int j = i + 1; j < n; j++) 
        {
            if (arr[j] < arr[min]) 
            {
                min = j;
            }
        }
        swap(i, min, arr);
    }
}
 
int main() 
{
    int T;
    scanf("%d", &T);
 
    while (T--) 
    {
        int N;
        scanf("%d", &N);
 
        int arr[N];
        for (int i = 0; i < N; i++) 
        {
            scanf("%d", &arr[i]);
        }
 
        sel(arr, N);
 
        for (int i = 0; i < N; i++) 
        {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }
 
    return 0;
}

程序开始就定义了两个函数,第一个swap函数用于交换两个元素的值,第二个sel函数则是用来达到冒泡排序的目的的,外层for循环是遍历整个数组来控制从头到尾比较(即内层for循环)的次数,如果内层循环发现了错误的顺序则调用swap函数来交换数值。再来看主函数部分,首先定义并输入变量T,其用于控制while的次数来达到题目多组输入的目的。随后在循环内部首先定义并输入了变量N及一个长度为N的数组,再通过一个for循环来输入需要排序的数值,在调sel函数来冒泡排序,最后同样也是以一个for循环来输出排序后的结果。

三、快速排序
       即通过不断的选择基准值,并分别从左右两端自右向左查找比基准值小的数据和左向右查找比基准值大的数据来查找数组,且当一端找到目标数据后就会停止查找,待到另一端也找到了目标数据时就将这两个数据进行数值交换。然后再重复上述操作,直到左右两端的查找汇合时停止,这时将此位置上的数据与此时的基准值进行换值,然后对基准值两边的数据分别找出新的基准值重复上述操作,如此重复后就能实现排序。
(刚开始学习还没有找到题目)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值