数据结构与算法学习(day4)——解决实际问题

这篇具有很好参考价值的文章主要介绍了数据结构与算法学习(day4)——解决实际问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  1. 在本章的学习此前,需要复习前三章的内容,每个算法都动手敲一遍解题。宁愿学慢一点,也要对每个算法掌握基本的理解!

  2. 前面我们学习了简化版桶排序、冒泡排序和快速排序三种算法,今天我们来实践一下前面的三种算法。

  3. 本章的学习目标:

(1)回顾三个算法的基本原理,能够熟悉运用三个算法解决问题

(2)用三种不同算法解决同一个问题

题目

(1)输入有2行,第1行为一个正整数,表示有n个同学参与调查(n<=100)。第2行有n个用空格隔开的正整数,为每本图书的ISBN号(假设图书的ISBN号在1~1000)。

(2)输出也是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

(3)最后,程序运行的时间限制为1s。

分析题目

我们要实现的要求有:

  1. 对数据按从小到大顺序排列
  2. 去重

方法一

我想到的第一个方法就是用简化版桶排序。

程序如下:

#include <stdio.h>
int book[1001], n;
int main()
{
	int i, j, k=0, t;
	for (i = 0; i <= 1000; i++)
		book[i] = 0;
		
	scanf("%d",&n);
	for (i = 1; i <= n; i++)
	{
		scanf("%d", &t);
		book[t]++;

		if (book[t] == 1)
		{
			book[t] = 2;
			k++;
		}
		else if (book[t] > 2)
		{
			book[t] = 2;
		}
	}
	printf("%d\n",k);
	for (i = 1; i <= 1000; i++)
		if(book[i]==2)
			printf("%d ", i);
}

效果如图
数据结构与算法学习(day4)——解决实际问题,数据结构与算法(C语言),学习,算法,数据结构

我们来评价一下这个程序,毫无疑问,这个程序比较无脑,不是一个巧妙的处理方式,但是也可以实现题目要求。

  1. 程序运用的方法是比较简单的桶排序
  2. 思路是先排序(排序实际上数组已经排好了),后去重。
  3. 这个方法的时间复杂度就是桶排序的时间复杂度O(N+M)。

方法二

第二种方法也是先排序后去重,排序我们可以使用冒泡排序或者快速排序,这里我们用冒泡排序举例。

#include <stdio.h>
int main()
{
	int a[1001], i,j, n,t,k = 0;
	scanf("%d",&n);

	for (i = 0; i < n; i++)
		scanf("%d",&a[i]);

	//开始冒泡排序
	for (i = 0; i < n - 1; i++)
	{
		for (j = 0; j < n - i - 1; j++)
		{
			if (a[j] > a[j + 1])  //按从小到大的顺序排列
			{
				t = a[j]; a[j] = a[j + 1]; a[j + 1] = t;
			}
		}
	}

	for (i = 0; i < n; i++)
	{
		if (a[i] == a[i - 1])  //计算重复元素的个数
			k++;
	}

	printf("%d\n",n - k);

	for (i = 0; i < n; i++)
	{
		if(a[i] != a[i-1])
			printf("%d ", a[i]);
	}	
	return 0;
}

数据结构与算法学习(day4)——解决实际问题,数据结构与算法(C语言),学习,算法,数据结构

我们来评价一下这个程序,

  1. 程序运用的方法是比较简单的冒泡排序
  2. 思路是先排序,后去重。
  3. 这个方法的时间复杂度就是桶排序的时间复杂度O(N^2),冒泡排序的时间复杂度在整个程序中是大块,所以其他两个的时间复杂度不计,时间复杂度比较高。
  4. 如果要排序的数字数量增大,大到10万,桶排序要申请更大的数组,不现实,而冒泡排序的时间复杂度高所以耗时不少,这时候就只能用快速排序,如下;
#include <stdio.h>
/*****************
*a[101]用于存放要排序的数组
* n是要排序的个数
*****************/
int a[1001], n;   //全局变量,这两个变量需要在子函数中使用
/*****************
* 函数名:quicksort
* 形参:int left, int right
* 返回值:无
* 作用:快速排序算法
* ****/
void quicksort(int left, int right)  // left一直都是1
{
	int i, j, t, temp;
	if (left > right)
		return;

	temp = a[left];  //temp中存的就是基准数
	i = left;
	j = right;
	while (i != j)  //相遇后跳出循环
	{
		//顺序很重要,要先从右往左找
		while (a[j] >= temp && i < j)
			j--;

		//再从左往右找
		while (a[i] <= temp && i < j)
			i++;

		//交换两个数再数组中的位置
		if (i < j)   //当哨兵i和哨兵j没有相遇时
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}

	//最终将基准数归位
	//若相遇,一定是在一个小于基准数的数相遇,将相遇时的数作为基准数进行下一轮的“探测”
	a[left] = a[i];
	a[i] = temp;

	quicksort(left,i-1);  //继续处理左边的,这里是一个递归的过程
	quicksort(i + 1, right);  //继续处理右边的,这里是一个递归的过程
}
int main()
{
	int i,j,k = 0;
	scanf("%d", &n);

	for (i = 1; i <= n; i++)
		scanf("%d", &a[i]);

	//开始快速排序
	quicksort(1, n);  //快速排序调用

	for (i = 1; i <= n; i++)
	{
		if (a[i] == a[i - 1])  //计算重复元素的个数
			k++;
	}

	printf("%d\n", n - k);

	for (i = 1; i <= n; i++)
	{
		if (a[i] != a[i - 1])
			printf("%d ", a[i]);
	}

	return 0;
}

数据结构与算法学习(day4)——解决实际问题,数据结构与算法(C语言),学习,算法,数据结构

(1)我们在写程序的时候,只要不是面试等需要现场手打程序,那我们可以利用之前写好的代码,移植到我们现在的问题上,来解决问题。

(2)所以,平时多储备知识和源码,还是很重要的,平时的积累,要求我们要掌握好知识,否则到移植的时候,半天都移植不成功。

小结

我们来回顾一下三个算法的时间复杂度。

(1)桶排序是最快的,时间复杂度为O(N+M);

(2)冒泡排序是O(N^2)

(3)快速排序是O(NlogN)

下一节,我们将进入栈、队列、链表的学习。文章来源地址https://www.toymoban.com/news/detail-708733.html

到了这里,关于数据结构与算法学习(day4)——解决实际问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 数据结构day08(树、算法)

    今日任务: 二叉树: 今日思维导图 链接: 快排:快速排序法(详解)_李小白~的博客-CSDN博客图画挺好啊 常见款:https://www.runoob.com/w3cnote/quick-sort.html  

    2024年02月10日
    浏览(27)
  • 数据结构与算法之美学习笔记:40 | 初识动态规划:如何巧妙解决“双十一”购物时的凑单问题?

    本节课程思维导图: 淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你女朋友的购物车中有 n 个(n100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限

    2024年02月03日
    浏览(41)
  • 新星计划Day6【数据结构与算法】 链表Part2

    👩‍💻博客主页:京与旧铺的博客主页 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年4月30日🎠 🎨你做三四月的事,八九月就会有答案,一起加油吧 🀄如果觉得博主的文章还不错的话,请三连支持一

    2023年04月08日
    浏览(43)
  • MySQL学习Day19——索引的数据结构

    一、为什么使用索引: 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教课书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据査找时,首先查看查询条件是否命中某条索引,符合则通过索引査找

    2024年02月21日
    浏览(32)
  • 【Java数据结构与算法】Day2-高级排序(希尔、归并、快速、计数)

    ✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:【Java数据结构与算法】 🥭本文内容:Java数据结构与算法中的比较高级的排序,希尔排序、归并排序、快速排序、计数排序

    2024年02月02日
    浏览(51)
  • JAVA基础学习笔记-day14-数据结构与集合源码2

    博文主要是自己学习JAVA基础中的笔记,供自己以后复习使用,参考的主要教程是B站的 尚硅谷宋红康2023大数据教程 君以此始,亦必以终。—左丘明《左传·宣公十二年》 7.1 List接口特点 List集合所有的元素是以一种 线性方式 进行存储的,例如,存元素的顺序是11、22、33。那

    2024年01月18日
    浏览(50)
  • Redis常用的数据结构及实际应用场景

    本文介绍了Redis中常用的数据结构,包括字符串、列表、集合、哈希表、有序集合和Bitmap,并结合实际案例详细说明了它们在各种场景下的使用。 Redis是一种基于内存的高性能键值存储系统,拥有多种数据结构,每种数据结构都具有独特的特点和适用场景。了解这些数据结构

    2024年02月08日
    浏览(37)
  • 【夜深人静学习数据结构与算法 | 第六篇】贪心算法

    目录 前言: 引入: 贪心算法:     455. 分发饼干 - 力扣(LeetCode) 376. 摆动序列 - 力扣(LeetCode) 53. 最大子数组和 - 力扣(LeetCode) 122. 买卖股票的最佳时机 II - 力扣(LeetCode)         在本文我们将为大家介绍在计算机中比较常见的一种算法:贪心算法。他并没有具体的代

    2024年02月09日
    浏览(33)
  • 【算法】递归解决各种数据结构的遍历问题

    对于递归算法,我们最先想到的应该就是用递归的方式去中序遍历一棵树,递归的使用使得我们可以先深入到下层中,然后慢慢的输出下层的元素之后输出上层元素。 因此,基于此,我们甚至可以使用递归来逆序输出一个栈,链表等数据结构。 使用递归输出树 使用递归逆序

    2024年02月08日
    浏览(52)
  • 学习数据结构和算法的第9天

    移除元素 ​ 给你一个数组 nums 和一个值 val ,你需要 原地 移除所有数值等于 val的元素,并返回移除后数组的新长度。 ​ 不要使用额外的数组空间,你必须仅使用 0(1)额外空间并 原地 修改输入数组。 ​ 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

    2024年02月21日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包