精华内容
下载资源
问答
  • 买书排序问题-------C语言算法

    千次阅读 2020-01-18 16:36:20
    看看同学们都喜欢读哪些书,每本书都自己唯一的 ISBN号 当然一些好书会很多同学都喜欢,我们需要去掉其中重复的 ISBN 号,即每个ISBN号只保留一个,也就是同样的书只买一本,然后再将这些书的 ISBN 号从小到大...

    C语言排序

    买书问题

    • 问题:学校要建立一个图书角,需要找一些同学做调查 ,看看同学们都喜欢读哪些书,每本书都有自己唯一的 ISBN号 当然一些好书会有很多同学都喜欢,我们需要去掉其中重复的 ISBN 号,即每个ISBN号只保留一个,也就是同样的书只买一本,然后再将这些书的 ISBN 号从小到大排序。

    • 分析:我们需要做的就是“去重”和“排序”的工作。

      例如:输入:
      10
      20 40 32 67 40 20 89 300 400 15
      则输出:
      8
      15 20 32 40 67 89 300 400*

    两种思路:

    1.桶排序法:

    • 所谓桶排序法 就是假如有11个桶,编号为0~10.每输入一个数,就向对应的桶里放一个🚩,最后只需要数每个桶里有几个🚩就好了。
    • 代码如下:
    #include<stdio.h>
    main()
    {
    	int a[11],i,j,t;
    	for(i=0;i<=10;i++)
    	{
    		a[i]=0;
    	}
    	for(i=1;i<=5;i++)
    	{
    		scanf("%d",&t);
    		a[t]++;
    	}
    	
    	for(i=0;i<=10;i++)
    	{
    		for(j=1;j<=a[i];j++)
    			printf("%d\n",i);
    	}
     } 
    

    首先申明一个数组表示编号为0~10的桶,第一个for循环,使每个桶的初始值为0,第二个for循环,是循环输入5个数,并读取这个数,读一个数,向对应的桶里插一个🚩,也就是a[t]++的含义,加一,第三个for循环就是依次判断编号0-10的桶,第四个for循环判断出现几次就将桶的编号打印几次。

    根据这个思路,我们再返回看图书馆对书的排序问题。根据这个问题我们发现稍加修改,我们就可以达到去重的效果。

    代码如下:

    #include<stdio.h>
    main()
    {
    	int a[1001],n,i,t;
    	for(i=1;i<=1000;i++)
    	{
    		a[i]=0;//初始化 
    	}
    	printf("请问你想输入几个数\n");
    	scanf("%d",&n);
    	
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d",&t);
    		a[t]=1;
    	}
    	
    	for(i=1;i<=1000;i++)
    	{
    		if(a[i]==1)
    		{
    			printf("%d",i);
    		}
    	 } 
     } 
    

    运行结果:

    输入:
    10
    20 40 32 67 40 20 89 300 400 15
    则输出:
    8
    20 40 32 67 89 300 400 15。

    我们发现这个时候只达到了去重的效果,而我们还需要排序,下面所用的冒泡排序可以到达去重和排序的效果。
    2.冒泡排序法:

    那么什么是冒泡排序法呢?
    首先我们观察代码

    #include<stdio.h>
    main()
    {
    	int a[100],n,i,j,t;
    	printf("请问有几个数字需要排序?");
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    	}
    	for(i=1;i<=n-14;i++)
    	{
    		for(j=1;j<=n-i;j++)
    		{
    			if(a[j]>a[j+1])
    			{
    				t=a[j];
    				a[j]=a[j+1];
    				a[j+1]=t;
    			}
    		}
    	}
    	for(i=1;i<=n;i++)
    	{
    		printf("%d",a[i]);
    	}
    }
    

    冒泡排序的基本思想是:比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。
    这里举例一个从大到小排序:
    例如:1,3,2,4,5
    首先1,3比较:1<3所以交换位置,得到:3,1,2,4,5
    1,2比较:1<2所以交换位置,得到:3,2,1,4,5
    以此类推 最终第一轮比较结果为:3,2,4,5,1
    接下来3,2比较,3>2,不交换,
    3,4比较,3<4交换位置得到:4,2,3,5,1
    以此类推:得到4,2,5,3,1
    经过n-1轮排序得到5,4,3,2,1

    而我们这道题还需要去重,只需要在输出的时候预先判断一下当前这个数a[i]与前面一个数a[i-1]是否相同就好了

    代码如下:

    #include<stdio.h>
    main()
    {
    	int a[101],n,i,j,t;
    	
    	printf("请问你需要输入几个数?");
    	scanf("%d",&n);
    	for(i=1;i<=n;i++)
    	{
    		scanf("%d",&a[i]);
    	}
    	
    	for(i=1;i<=n-1;i++)
    	{
    		for(j=1;j<=n-i;j++)
    		{
    			if(a[j]>a[j+1])
    			{
    				t=a[j];
    				a[j]=a[j+1];
    				a[j+1]=t;
    			}
    			
    		}
    	}
    	printf("%d",a[1]);
    	for(i=2;i<=n;i++)
    	{
    		if(a[i]!=a[i-1])
    		{
    			printf("%d\n",a[i]);
    		}
    	}
    	
    	
     } 
    

    我们可以看出前三个for循环是描述冒泡排序的,之后我们先输出第一个数,最后一个for循环从2开始,判断你要输出的这个数是否等于前一个输出的数,如果等于则不输出,这样就达到了去重的效果。

    展开全文
  • 前言排序算法是日常使用最频繁的一个算法,生活中也很常见什么排队呀按照高矮次序呀,分数按照一个从高到低的排序等等,但是如果是要设计出来面对基数很大又要很快的排序方法这就是需要很大难度了,先给大家看看排序...

    全文共 1200 字,阅读文本大概需要 3.1 分钟。

    前言

    排序算法是日常使用最频繁的一个算法,生活中也很常见什么排队呀按照高矮次序呀,分数按照一个从高到低的排序等等,但是如果是要设计出来面对基数很大又要很快的排序方法这就是需要很大难度了,先给大家看看排序的种类有哪些,和其对应的时间空间复杂度。

    ed609d38c16eec27e63af2410524f363.png

    最后一栏有个稳定性给看官解释一下:

    稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面。

    不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的后面。

    今天主要给大家介绍三种排序方法,并附上可视化动图

    正文

    1.冒泡排序

    冒泡排序(Bubble Sort) 最为简单的一种排序,通过重复走完数组的所有元素,通过打擂台的方式两个两个比较,直到没有数可以交换的时候结束这个数,再到下个数,直到整个数组排好顺序。因一个个浮出所以叫冒泡排序。双重循环时间 O(n^2)

    算法描述:

    比较相邻两个数据如果。第一个比第二个大,就交换两个数

    对每一个相邻的数做同样1的工作,这样从开始一队到结尾一队在最后的数就是最大的数。

    针对所有元素上面的操作,除了最后一个。

    重复1~3步骤,知道顺序完成。

    代码可视化:

    1f00c15190ac8f99431de7330ea224aa.png

    代码实现:

    7dbbe4a120b6262a8897708f28381f2c.png

    2.选择排序

    选择排序(Select Sort) 是直观的排序,通过确定一个 Key 最大或最小值,再从带排序的的数中找出最大或最小的交换到对应位置。再选择次之。双重循环时间复杂度为 O(n^2)

    算法描述:

    在一个长度为 N 的无序数组中,第一次遍历 n-1 个数找到最小的和第一个数交换。

    第二次从下一个数开始遍历 n-2 个数,找到最小的数和第二个数交换。

    重复以上操作直到第 n-1 次遍历最小的数和第 n-1 个数交换,排序完成。

    算法可视化:

    2cff20b5dfad8f1dcc7e729dc833fca5.png

    代码实现:

    30997130573901a6f2ddbf970ace5355.png

    3.快速排序

    快速排序(QuickSort)是排除稳定性因素后最常用的排序。给看官介绍两种使用方法,一种值直接在我文件 stdlib.h 头文件中的 qsort 函数实现是和正常写代码一样的。通过使用qsort(数组名,长度,sizeof(第一个数长度),compInc/comoDec) 进行实现数组的排序。后面的是通过递归调用的形式。

    算法描述:

    从数列中挑出一个元素作为基准。

    重新排列数列,把所有的比基准小的放在基准前面,反之放在后面(一样大可任意一边)完成后基准处在分区的中间位置。

    通过递归调用把小于基准元素和大雨基准元素的子序列进行排序。

    算法可视化:

    c10670304c0db33543f1759f01ead20c.png

    代码实现:

    f77fe9f14d67c1bbb7d383dce805c085.png

    展开全文
  • 算法】系列文章目录需求介绍思路分析C语言代码方法一方法二 需求介绍   小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的 ISBN 号...

    【啊哈!算法】系列文章目录



    需求介绍

      小哼的学校要建立一个图书角,老师派小哼去找一些同学做调查,看看同学们都喜欢读哪些书。小哼让每个同学写出一个自己最想读的书的 ISBN 号(你知道吗?每本书都有唯一的 ISBN 号,不信的话你去找本书翻到背面看看)。当然有一些好书会有很多同学都喜欢,这样就会收集到很多重复的 ISBN 号。小哼需要去掉其中重复的 ISBN 号,即每个 ISBN 号只保留一个,也就说同样的书只买一本(学校真是够抠门的)。然后再把这些 ISBN 号从小到大排序,小哼将按照排序好的 ISBN 号去书店买书。请你协助小哼完成“去重”与“排序”的工作。
      输入有 2 行,第 1 行为一个正整数,表示有 n 个同学参与调查(n≤100)。第 2 行有 n 个用空格隔开的正整数,为每本图书的 ISBN 号(假设图书的 ISBN 号在 1~1000 之间)。
      输出也是 2 行,第 1 行为一个正整数 k,表示需要买多少本书。第 2 行为 k 个用空格隔开的正整数,为从小到大已排好序的需要购买的图书的 ISBN 号。
      例如输入:

    	10 
    	20 40 32 67 40 20 89 300 400 15 
    

      则输出:

    	8 
    	15 20 32 40 67 89 300 400 
    

      最后,程序运行的时间限制为 1 秒。

    思路分析

      解决这个问题的方法大致有两种。
      第一种方法: 先将这 n 个图书的 ISBN 号去重,再进行从小到大排序并输出;
      第二种方法: 先从小到大排序,输出的时候再去重。

    C语言代码

    方法一

      桶排序+筛选

    // 桶排序+筛选
    /* 说明: 
    若每个图书ISBN 号都是1~1000 之间的整数,图书数量 n 的范围不是小于等于100,而是小
    于等于10 万 时 适用此法。 
    */ 
    
    # include <stdio.h>
    
    int main() {
    	int book[1001],i,k,n;
    	scanf("%d",&n);
    	for(i=0;i<=1000;i++) {
    		book[i] = 0;
    	}
    	for(i=0;i<n;i++) {
    		scanf("%d",&k);
    		book[k]++;
    	} 
    	for(i=0;i<=1000;i++) {
    		if(book[i]>0) {
    			printf("%d ",i);
    		}
    	}	
    	return 0;
    }
    
    /*
    输入:
    10
    20 40 32 67 40 20 89 300 400 15 
    输出:
    15 20 32 40 67 89 300 400
    */ 
    

      这种方法的时间复杂度就是桶排序的时间复杂度,为 O(N+M)。

    方法二

      快速排序+筛选

    // 快速排序+筛选
    
    # include <stdio.h>
    
    long long a[100000];
    
    void quicksort(long long left, long long right) {
    	long long i,j,k,temp;
    	if(left>right) {
    		return; 
    	}
    	temp = a[left];
    	i = left;
    	j = right;
    	while(i!=j) {
    		while(a[j]>=temp && i<j) {
    			j--;
    		}
    		while(a[i]<=temp && i<j) {
    			i++;
    		}
    		if(i<j){
    			k = a[j];
    			a[j] = a[i];
    			a[i] = k;
    		}
    	}
    	a[left] = a[i];
    	a[i] = temp;
    	
    	quicksort(left,i-1);
    	quicksort(i+1,right);
    }
    
    int main() {
    	long long i,n;
    	scanf("%lld",&n);
    	for(i=0;i<n;i++) {
    		scanf("%lld",&a[i]);
    	}
    	quicksort(0,n-1);
    	printf("%lld ",a[0]);
    	for(i=1;i<n;i++) {
    		if(a[i]!=a[i-1]) {
    			printf("%lld ",a[i]);
    		}
    	}
    	return 0;
    }
    
    
    /*
    输入:
    10
    20 40 32 67 40 20 89 300 400 15 
    输出:
    15 20 32 40 67 89 300 400
    */ 
    

      这种方法的时间复杂度由两部分组成,一部分是冒泡排序的时间复杂度,是 N(N2)N (N^2),另一部分是读入和输出,都是 O(N)O(N),因此整个算法的时间复杂度是 O(2N+N2)O(2*N+N^2)。相对于 N2N^2来说,2N2*N 可以忽略(我们通常忽略低阶),最终该方法的时间复杂度是 O(N2)O(N^2)

    展开全文
  • C语言学习路线

    2020-12-22 19:05:46
    算法有哪些 3.数据类型 C语言包含的数据类型 变量的命名规则 常量、变量 4.运算符与表达式 什么是运算符 什么是表达式 5.输入输出函数 字符串的输入输出 6.选择程序结构 if语句,if else语句 使用 switch...

    ①入门篇

    1.了解C语言

    C语言历史
    C语言特点

    2.算法

    什么是算法
    算法有哪些

    3.数据类型

    C语言包含的数据类型
    变量的命名规则
    常量、变量

    4.运算符与表达式

    什么是运算符
    什么是表达式

    5.输入输出函数

    字符串的输入输出

    6.选择程序结构

    if语句,if else语句 使用
    switch语句 使用

    7.循环语句

    for循环、while循环、do while循环运用


    ②进阶篇

    1.数组

    一堆数组、二堆数组、字符数组
    数组的运用方式

    2.排序方法

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

    3.函数

    函数的定义
    函数的参数与返回值

    4.指针

    指针变量运算
    数组指针、字符串指针、二级指针、函数指针

    5.字符串

    字符串输入输出
    字符串处理函数
    字符串长度获取、大小写转换


    ③终极篇

    1.结构体

    结构体指针、结构体数组
    C语言枚举类型、共同体、位运算

    2.文件操作

    文件打开与关闭
    文件读写

    3.内存管理

    内存组织方式
    动态内存分配

    展开全文
  • 学习Linux基础及C语言,对嵌入式C语言有一定的精通掌握,内容包括有Linux基础、shell命令、Linux 网络配置、C语言开发环境搭建、指针、函数、结构体和共用体、存储类型及其他知识点。 2.数据结构 掌握数据结构的概念...
  • 交换算法的实现

    千次阅读 2014-01-18 18:34:38
    数据的交换是编程中最常用的一种算法,比如排序算法就是利用交换算法实现数字排序,基本上对数据的处理都和数据的交换有着千丝万缕的联系,哪我们今天就来学学在C语言有哪些交换算法 在写代码前,先看一下数据...
  • 算法穷性是指算法必须能在执行有限个步骤之后终止 D. 以上三种描述都不对 (2) 以下数据结构中不属于线性数据结构的是______。(C) A. 队列 B. 线性表 C. 二*树 D. 栈 (3) 在一棵二*树上第5层的结点数最多是_____...
  • 算法穷性是指算法必须能在执行有限个步骤之后终止 D. 以上三种描述都不对 (2) 以下数据结构中不属于线性数据结构的是(C) A. 队列 B. 线性表 C. 二叉树 D. 栈 (3) 在一棵二叉树上第5层的结点数最多是(B) 注:由...
  • 排序算法学过吗?讲一下你知道哪些?给你实际案例,用哪一种排序合适? 计算机网络学过吗?说一下 tcp udp区别 现在三次握手后 我有一万条数据要发送,发100条就中断了,再发400条又中断了,碰到这种情况如何...
  • 几道华为面试题

    2011-09-30 12:39:46
    1、C语言实现链表转置 struct List { int data; List* next; }; void Fun(List* head) ...2、写个堆排序算法。...3、排序算法有哪些?给出每种算法的复杂度。 4、证明圆锥的体积等于圆柱体积的三分
  • 1、进程切换的过程是怎样的?什么是用户态,核心态?什么时候发生进程切换? 2、如何编写一个线程安全的HashMap? 3、java集合中ArrayList,LinkList,Vector的区别?...的办法有哪些种? 8、各种排序...
  • 13. 冒泡排序算法的时间复杂度是什么? O(n^2) 14. 写出float x 与“零值”比较的if语句。 if(x>0.000001&&x) 16. Internet采用哪种网络协议?该协议的主要层次结构? tcp/ip 应用层/传输层/网络层/数据链路层/物理...
  • 首先关于算法的分析,要找到连续子串,首先要确定有哪些子串,这个可以通过两个for循环以及strlen()/2减少到1来确定,这里 似乎和希尔排序的增量n查找有点像;然后就是子串匹配的过程了,若相同,则更新出现次数,...
  • 数据结构课程设计

    2014-01-25 13:55:30
    要求:(1)对冒泡排序、直接排序、简单选择排序、快速排序、希尔排序、堆排序算法进行比较; (2)待排序表的表长不小于100,表中数据随机产生,至少用5组不同数据作比较,比较指标:关键字参加比较次数和关键字的...
  • STL的容器类和迭代器

    2021-05-19 21:10:20
    1.STL的容器类介绍 1.1、何为容器 (1)顾名思义,容器就是盛放东西的东西,这里被盛放的一般是数据对象,...1.2、STL有哪些容器类 (1)序列容器。元素在容器中的位置同元素的值无关,即容器不是排序的(类似于C数组)。包
  • C++程序员面试宝典

    热门讨论 2013-04-01 13:36:19
    13.7 排序算法的总结 180 第14章 软件工程(教学视频:39分钟) 182 14.1 软件工程基础 182 面试题158 什么是软件工程 182 面试题159 什么是软件危机 183 14.2 软件的4大开发模型 184 面试题160 4大开发模型的区别 ...
  • 还介绍了排序算法及数据结构的实现,包括链表、堆栈、队列和树。此外,本书开始用两章篇幅详细介绍了中英文面试的注意事项、常见问题及程序员的职业规划等软件工程师的常识。最后四章详细讲解了现在流行的智力测试题...
  • 同时,我们可以通过这张C++世界地图,了解C++世界的整个面貌:有哪些好玩的地方,有哪些有趣的故事,有哪些有用的知识,有哪些危险而需要注意的地方。这张C++世界地图,将带领我们畅游整个C++世界。  还等什么,让...
  • 1. 通过分析、设计、编码、调试等各环节的训练,深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。 2. 综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,逐步掌握...
  • 神经网络提取特征的方式有哪些 介绍下你了解的轻量级CNN模型 网络模型压缩方面的剪枝,量化和二值化编码 基于视频的C3D三维网络模型有听说过嘛 2.5D卷积呢 什么是空洞卷积,什么是反卷积,作用是什么 如何...
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    8. 一个算法具有 5个特性: (1)穷性 、 (2)确定性 、 (3)可行性 ,零个或多个输入、一个或多个输出。 《数据结构 1800题》 9.已知如下程序段 FOR i:= n DOWNTO 1 DO {语句 1} BEGIN x:=x+1;...
  • 英特尔面试专项准备

    2020-12-09 13:46:46
    <p>2.4/2.6内核你知道的有哪些不同 </li><li> 进程管理 </li><li> 进程调度算法有哪些影响进程优先级的因素 </li><li> 设备管理 </li><li> <p>Linux下常用命令 </li><li> 内存使用 </li><li> <p>linux中数据...
  • 求读者较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典...
  • 求读者较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典...
  • C语言课程设计报告—班级成绩管理系统 需要分析: 学生成绩管理系统13种功能。把这13个功能做成13个子函数。在主函当数中设计一个菜单对这13个子数进行管理。来实现对整个系统的操作。 根据课题的要求。每一个...
  • 求读者较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典...
  • 求读者较多C语言方面的背景知识。本书可作为高等院校C++课程的教材,也可供初学者自学C++时使用。 本书享有“程序员和开发人员学习C++的完整教程”的美誉,它经过仔细的测试,制作精细,是计算机 行业的经典...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    34.EJB规范规定EJB中禁止的操作有哪些? 35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式? 37.classloader中,JDK的API、...
  • 8.冒泡排序算法的时间复杂度是什么? 时间复杂度是O(n^2)。 9.写出float x 与“零值”比较的if语句。 if(x>0.000001&&x) 10.Internet采用哪种网络协议?该协议的主要层次结构? Tcp/Ip协议 主要层次结构为: ...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

c语言有哪些排序算法

c语言 订阅