数据结构之内部排序

这篇具有很好参考价值的文章主要介绍了数据结构之内部排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

7-1 直接插入排序

输入格式:

输出格式:

输入样例:

输出样例:

7-2 寻找大富翁

输入格式:

输出格式:

输入样例:

输出样例:

7-3 PAT排名汇总

输入格式:

输出格式:

输入样例:

输出样例:

7-4 点赞狂魔

输入格式:

输出格式:

输入样例:

输出样例:

7-5 链式基数排序

输入样例:

输出样例:


7-1 直接插入排序

分数 10

全屏浏览题目

切换布局

作者 黄龙军

单位 绍兴文理学院

给定一个整数序列,请按非递减序输出采用直接插入排序的各趟排序后的结果。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。

输出格式:

对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。

输入样例:

4
8 7 2 1

输出样例:

7 8 2 1
2 7 8 1
1 2 7 8

 

#include <stdio.h>
#define MaxSize 1000
struct SqList {
    int r[MaxSize + 1];
    int length;
};
void Read(struct SqList *L, int n) {
    L->length = n;
    for (int i = 1; i <= L->length; i++) {
        scanf("%d", &L->r[i]);
    }
}
void Print(struct SqList *L) {
    for (int i = 1; i <= L->length; i++) {
        if (i > 1) printf(" ");
        printf("%d", L->r[i]);
    }
    printf("\n");
}
void InsertSort(struct SqList *L) {
    for (int i = 2; i <= L->length; i++) {
        if (L->r[i] < L->r[i - 1]) {
            L->r[0] = L->r[i];
            int j;
            for (j = i - 1; L->r[0] < L->r[j]; j--)
                L->r[j + 1] = L->r[j];
            L->r[j + 1] = L->r[0];
        }
        Print(L);
    }
}
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        struct SqList L;
        Read(&L, n);
        InsertSort(&L);
    }
    return 0;
}

 

7-2 寻找大富翁

分数 25

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人。假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁。

输入格式:

输入首先给出两个正整数N(≤106)和M(≤10),其中N为总人数,M为需要找出的大富翁数;接下来一行给出N个人的个人资产值,以百万元为单位,为不超过长整型范围的整数。数字间以空格分隔。

输出格式:

在一行内按非递增顺序输出资产排前M位的大富翁的个人资产值。数字间以空格分隔,但结尾不得有多余空格。

输入样例:

8 3
8 12 7 3 20 9 5 18

输出样例:

20 18 12
#include<stdio.h>
int main(){
    int n,m;
    int a[1000000];
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    int flag=0;
    int t;
    for(int p=n-1;p>=0;p--){
        flag=0;
        for(int i=0;i<p;i++){
            if(a[i]>a[i+1]){
                t=a[i];
                a[i]=a[i+1];
                a[i+1]=t;
                flag=1;
            }
        }
        if(flag==0) break;
    }
    if(m>n){
        for(int i=n-1;i>=1;i--){
            printf("%d ",a[i]);
        }
        printf("%d",a[0]);
    }
    else{
    for(int i=n-1;i>n-m;i--){
        printf("%d ",a[i]);
    }
    printf("%d",a[n-m]);
    }
}

7-3 PAT排名汇总

分数 25

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。

每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。

现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。

输入格式:

输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。

输出格式:

首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。

输入样例:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

输出样例:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

 

#include <stdio.h>
struct stu
{
    char id[14];                //考号
    int score;                  //分数
    int kc;                     //考场
};
struct stu a[30000];
int bigger(const char *s1,const char *s2)
{
    for(int i=0;i<13;i++)
        if(s1[i] > s2[i])
            return 1;
        else if(s1[i] < s2[i])
        	return 0;
    return 1;
}
void qsort(int l,int r)
{
	if(l >= r)
	return ;
	
    int i = l;
    int j = r;
    struct stu t = a[l];
    while(i != j)
    {
        while(i < j && (a[j].score < t.score || a[j].score == t.score && bigger(a[j].id,t.id)))
            j--;
        while(i < j && (a[i].score > t.score || a[i].score == t.score && bigger(t.id,a[i].id)))
            i++;
        if(i < j)
        {
            struct stu s = a[i];
            a[i] = a[j];
            a[j] = s;
        }
    }
    a[l] = a[i];
    a[i] = t;
    qsort(l,i-1);
    qsort(i+1,r);
    return ;
}
void Copy(int *b2,int *b1,int n)
{
	for(int i=1;i<=n;i++)
	b2[i] = b1[i];
}
int main()
{
    int n,j,i,top = 0;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        int k;
        scanf("%d",&k);
        for(j=0;j<k;j++)
        {
            char id[14];
            int score;
            scanf("%s %d",id,&score);
            a[top].score = score;
            a[top].kc = i;
            strcpy(a[top].id,id);
            top++;
        }
    }
    qsort(0,top-1);
    int levall = 1,b1[n+1],b2[n+1],score = a[0].score;
    for(i=1;i<=n;i++)
        b1[i] = 1,b2[i] = 1;
    printf("%d\n",top);
    printf("%s %d %d %d\n",a[0].id,1,a[0].kc,1);
    int llevall = 1;            //上一个总排名
    levall = 2;                   //总排名
    Copy(b2,b1,n);
    b1[a[0].kc]++;	
    for(i=1;i<top;i++)
    {
        if(a[i].score == a[i-1].score)
        {
            printf("%s %d %d %d\n",a[i].id,llevall,a[i].kc,b2[a[i].kc]);
            levall++;
            b1[a[i].kc]++;
        }
        else
        {
            printf("%s %d %d %d\n",a[i].id,levall,a[i].kc,b1[a[i].kc]);
            llevall = levall;
            levall++;
            
		    Copy(b2,b1,n);
		    b1[a[i].kc]++;					//考场的排名 
        }
    }
    return 0;
}

 

7-4 点赞狂魔

分数 25

全屏浏览题目

切换布局

作者 陈越

单位 浙江大学

微博上有个“点赞”功能,你可以为你喜欢的博文点个赞表示支持。每篇博文都有一些刻画其特性的标签,而你点赞的博文的类型,也间接刻画了你的特性。然而有这么一种人,他们会通过给自己看到的一切内容点赞来狂刷存在感,这种人就被称为“点赞狂魔”。他们点赞的标签非常分散,无法体现出明显的特性。本题就要求你写个程序,通过统计每个人点赞的不同标签的数量,找出前3名点赞狂魔。

输入格式:

输入在第一行给出一个正整数N(≤100),是待统计的用户数。随后N行,每行列出一位用户的点赞标签。格式为“Name K F1​⋯FK​”,其中Name是不超过8个英文小写字母的非空用户名,1≤K≤1000,Fi​(i=1,⋯,K)是特性标签的编号,我们将所有特性标签从 1 到 107 编号。数字间以空格分隔。

输出格式:

统计每个人点赞的不同标签的数量,找出数量最大的前3名,在一行中顺序输出他们的用户名,其间以1个空格分隔,且行末不得有多余空格。如果有并列,则输出标签出现次数平均值最小的那个,题目保证这样的用户没有并列。若不足3人,则用-补齐缺失,例如mike jenny -就表示只有2人。

输入样例:

5
bob 11 101 102 103 104 105 106 107 108 108 107 107
peter 8 1 2 3 4 3 2 5 1
chris 12 1 2 3 4 5 6 7 8 9 1 2 3
john 10 8 7 6 5 4 3 2 1 7 5
jack 9 6 7 8 9 10 11 12 13 14

输出样例:

jack chris john
#include<stdio.h>
typedef struct
{
    char name[20];
    int sum;   //不同标签总数
    int num;    //点赞总数
}User;
int fact[100000000];
int main()
{
    int n,k;
    scanf("%d",&n);
    User users[100];
    int facter[100][1001];
    int i,j;
    for(i=0;i<n;i++)
    {
        users[i].sum=0;
        scanf("%s",users[i].name);
        scanf("%d",&users[i].num);
        for(j=0;j<users[i].num;j++)
        {
            scanf("%d",&facter[i][j]);
            fact[facter[i][j]]++;
            if(fact[facter[i][j]]==1)
                users[i].sum++;
        }
       for(j=0;j<users[i].num;j++) //重新归0
            fact[facter[i][j]]=0;
    }
    //进行排序(这边建议使用选择排序)
    int max;
    for(i=0;i<n-1;i++){
        max=i;
        for(j=i+1;j<n;j++){
            if(users[max].sum<users[j].sum)
                max=j;
            else if(users[max].sum==users[j].sum&&users[max].num>users[j].num)
                max=j;
        }
        User t=users[i];
        users[i]=users[max];
        users[max]=t;
    }
    if(n<3)
    {
        for(i=0;i<n-1;i++)
            printf("%s ",users[i].name);
            printf("%s",users[n-1].name);
        for(i=0;i<3-n;i++)
            printf(" -");
    }
    else
    {
        printf("%s %s %s",users[0].name,users[1].name,users[2].name);
    }
    return 0;
}

7-5 链式基数排序

分数 15

全屏浏览题目

切换布局

作者 王东

单位 贵州师范学院

实现链式基数排序,待排序关键字n满足1≤n≤1000,最大关键字数位≤5。

输入样例:

第一行输入待排序个数n(1≤n≤1000),再输入n个数(n的数位≤5)。

10
278 109 63 930 589 184 505 269 8 83

输出样例:

输出每趟分配-收集后链表中的关键字,趟数为序列中最大值的数位(如样例中930的数位为3),每行结尾有空格。

930 63 83 184 505 278 8 109 589 269 
505 8 109 930 63 269 278 83 184 589 
8 63 83 109 184 269 278 505 589 930 
#include<stdio.h>
struct tong{
    int a[1000];
    int sum;//sum指的是存入桶中的数据个数
};
typedef struct tong tong;
int ad[1000];
int findmax(int n){
    int max=0;
    int t;
    int weishu=0;
    for(int i=0;i<n;i++){
        weishu=0;
        t=ad[i];
        while(t!=0){
            t=t/10;
            weishu++;
        }
        if(weishu>max)
        max=weishu;
    }
    return max;
}
int main(){
    int n;
    int t;
    tong ts[10];
    for(int i=0;i<10;i++)
        ts[i].sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&ad[i]);
    //接下来我们要找出最大位数
    int wei=findmax(n);
    for(int i=0;i<wei;i++){
        for(int j=0;j<n;j++){
            t=ad[j];
            t=t/pow(10,i);
             t=t%10;
            ts[t].a[ts[t].sum++]=ad[j];
        }
        //接下来取出桶中数据更新ad数组
        int n1=0;
        for(int j=0;j<10;j++){  //10个桶
            for(int k=0;k<ts[j].sum;k++){
                ad[n1++]=ts[j].a[k];
            }
        }
        //打印
        for(int j=0;j<n;j++){
            printf("%d ",ad[j]);
        }
        printf("\n");
        //进行桶的归0
        for(int j=0;j<10;j++){
            //数组没必要更新,反正会覆盖
            ts[j].sum=0;
        }
    }
}

 文章来源地址https://www.toymoban.com/news/detail-757161.html

到了这里,关于数据结构之内部排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【排序算法】数据结构排序详解

    前言: 今天我们将讲解我们数据结构初阶的最后一部分知识的学习,也是最为“炸裂”的知识---------排序算法的讲解!!!! 排序 :所谓排序,就是使一串记录,按照其中的某个或某些的大小,递增或递减的排列起来的操作。 稳定性 :假定在待排序的记录序列中,

    2023年04月08日
    浏览(38)
  • 数据结构和算法笔记4:排序算法-归并排序

    归并排序算法完全遵循分治模式。直观上其操作如下: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。 解决:使用归并排序递归地排序两个子序列。 合并:合并两个已排序的子序列以产生已排序的答案。 我们直接来看例子理解算法的过程,下面是要排序

    2024年01月21日
    浏览(47)
  • 【数据结构与算法】十大经典排序算法-插入排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 插入排序(Insertion Sort)是一种简单直观的排序算法,其基本思想是将一个记录插入到已排好序的有序序列中,直到所有记录

    2024年02月13日
    浏览(60)
  • 【数据结构与算法】十大经典排序算法-快速排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 快速排序(Quick Sort)是一种高效的排序算法,是对冒泡排序的优化。它采用分治法(Divide and Conquer)的思想,将待排序序列

    2024年02月13日
    浏览(47)
  • 【数据结构与算法】十大经典排序算法-冒泡排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌴 掘金 :HelloCode 🌞 知乎 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地交换相邻元素的位置来将最大(或最小)的元素逐步“冒泡”到

    2024年02月14日
    浏览(53)
  • 【数据结构与算法】十大经典排序算法-希尔排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 希尔排序是一种插入排序的改进版本,旨在解决插入排序在处理大规模数据时的效率问题。通过将数组分为多个子序列并对

    2024年02月12日
    浏览(57)
  • 数据结构——排序算法之快速排序

        个人主页: 日刷百题 系列专栏 : 〖C/C++小游戏〗 〖Linux〗 〖数据结构〗   〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ ​ 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。 基本思想: 任取待排序元素序列中 的某元素作为基准值,按照

    2024年01月21日
    浏览(39)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(50)
  • 数据结构与算法-排序算法

    递归将整个函数的调用过程 调用过程 如何在CSDN博客中插入公式和各种符号 类似二叉树的后续遍历 递归行为和递归行为时间复杂度的估算 master 公式 : T ( n ) = a × T ( n b ) + O ( n d ) T(n) = a times T (frac{n}{b}) + O(n^d) T ( n ) = a × T ( b n ​ ) + O ( n d ) T ( n ) T(n) T ( n ) : 母问题的规模

    2024年02月15日
    浏览(37)
  • 算法 数据结构 递归插入排序 java插入排序 递归求解插入排序算法 如何用递归写插入排序 插入排序动图 插入排序优化 数据结构(十)

    1. 插入排序(insertion-sort):                                           是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入     算法稳定性:                  

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包