首页 > 编程语言 >DAY 1 数据结构与算法 (选择排序,冒泡排序,插入排序)

DAY 1 数据结构与算法 (选择排序,冒泡排序,插入排序)

时间:2024-07-07 12:57:54浏览次数:20  
标签:arr 第二位 数字 int 插入排序 冒泡排序 有序 排序 DAY

1.选择排序

        选择排序(Selection Sort)是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选择最小(或最大)的一个元素,放在已排好序的元素序列的末尾,直到全部待排序的数据元素排好序为止。即每一次设定一个数为最大或者最小值,然后与其他的数进行交换。

(1)首先定义第一位数字为“最小值”,然后与后面的数字一一比较,如有发现比这个数字更小的数字,就进行交换,这样就可以让第一位数字成为名副其实的最小值。

(2)之后定义第二位数字为“最小值”,再与后面的数字一一比较,如有发现比这个数字更小的数字,就进行交换,这样就可以让第二位数字成为名副其实的次小值。

.......一直到最后一位数字就终止了,这就是选择排序的大致思想和流程。

代码如下:

#include<stdio.h>
int main(void)
{
	int n;
	scanf("%d",&n);
	int arr[n];
	int i,j,k;
	for(i=0;i<n;i++)
		scanf("%d",&arr[i]);
	for(j=0;j<n;j++)//这代表定义哪一位作为“最小值”。
		{
			for(k=j+1;k<n;k++)//让后续每一位与“最小值”比较,更小即交换
				{
					if(arr[k]<arr[j])//如若更小,swap
                        {
                            int t;
                            t=arr[k];
                            arr[k]=arr[j];    
                            arr[j]=t;
                        }
				}
		}
	printf("The sorted arr:\n");
	for(i=0;i<n;i++)
		printf(" %d",arr[i]);
	return 0;
 } 

2.冒泡排序

        冒泡排序的思想也是比较简单的,它的思想是通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。与选择排序所不同的是,它并不需要定义“最大最小值”

(1)首先,从第一位开始,与第二位比较,如若第一位比第二位大,则交换,一直交换到最后一位,此时可以发现,最后一位其实就是最大的。第N位就是最大的。

(2)其次,依然从第一位开始,与第二位进行比较,一直到第N-1位,此时第N-1位的数字就是最大的。

......不难发现,我们是从0~(n-1),0~(n-2)......0~(n-n) 最后达成有序。

代码如下:

#include<stdio.h>
int main(void)
{
	int n,i;
	scanf("%d",&n);
	int arr[n];
	for(i=0;i<n;i++)
		scanf("%d",&arr[i]);
	int j,k;
	for(j=n-1;j>0;j--)//0~n 0~n-1 0~n-2 .... 0~0有序
		for(k=0;k+1<j;k++)//从第一位开始,两两比较,注意边界为j.
			{
				if(arr[k]>arr[k+1])//如果左侧比右侧大则交换 swap
					{
						int t;
                        t=arr[k];
                        arr[k]=arr[j];
                        arr[j]=t;
					}
			}
	printf("The sorted arr:\n"); 
	for(i=0;i<n;i++)
		printf("%d ",arr[i]);//output
	return 0;
 }

3.插入排序

        插入排序很像我们在玩斗地主的时候的抓牌流程,假设我们抓了一张牌,为了保证有序性,我们可以从最小的一张开始从右向左进行比对,如果抓的是大王,很显然我们要把它放在最左侧,

如果是一张3,很显然我们把它放在最右侧,这对数组来说是有实际意义的,即 不能越界。

核心思想:0~0有序 0~1有序 0~2有序 0~n-1有序。

(1)0~0一定是有序的。

(1)0~1上,就让第二位与第一位比较,谁大谁放右侧(左侧亦可)。//从右向左比较,体现插入性,即在原来0~n有序的基础上,插入一个新的数字。

(2)0~2上,让第三位与第二位比较,之后更新数值后,再让第二位与第一位比较,实现0~2上的有序。

...不难发现,其实是让数据0~0有序 0~1有序.... 在0~n-2有序的前提下 插入第n位数字 并且使之有序。即为插入 排序

代码如下:

//插入排序
#include<stdio.h>
int main(void)
{
int n,i;
scanf("%d",&n);
int arr[n];
for(i=0;i<n;i++)
	scanf("%d",&arr[i]);
int j,k;//保证0~i有序
for(j=1;j<n;j++)//0~0一定有序,所以之间从0~1上开始
	for(k=j;k-1>=0;k--)//从右向左两两比较 0~j上有序,注意边界,最小为0,最大为n-1。 
		{
			if(arr[k-1]>arr[k])//当左侧大于右侧数值交换 swap
				{
					int t;
                    t=arr[k-1];
                    arr[k-1]=arr[k];
                    arr[k]=t;
				}	
		} 
printf("The sorted arr:");
for(i=0;i<n;i++)
	printf(" %d",arr[i]); 
return 0;	
}

 谢谢!

                                                                                                                                             2024/7/6

标签:arr,第二位,数字,int,插入排序,冒泡排序,有序,排序,DAY
From: https://blog.csdn.net/2301_80159044/article/details/140229672

相关文章

  • DAY 1: C语言异或(^)以及按位与(&)的用法
    1.异或(^)的定义        在C语言中,异或操作符是^。异或操作符用于对两个操作数执行按位异或运算,即只有在两个操作数对应位不同时,结果为1。即相同为0不同为1。2.重要结论    1.任何一个数,假定为a,0^a等于a(不进位计算求和),a^a等于0。        2.异或运......
  • 【Postopia Dev Log】Day 2
    考虑到不确定能把系统做到什么程度,暂时不考虑分布式相关事宜运行./gradlewbootRun热加载不知道为什么没有生效,找来找去没找到原因想直接用dokcer实现,不熟悉docker和dockercompose困难重重根据SpringBootDevToolsAutoRestartandLiveReload一顿操作之后控制台有反应了......
  • day02-项目搭建+consul
    1RestTemplateRestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集官网地址:https://docs.spring.io/spring-framework/docs/6.0.11/javadoc-api/org/springframework/web/client/RestTe......
  • 冒泡排序
    冒泡排序#include<iostream>usingnamespacestd;voidbubbleSort(intarr[],intn){ boolflag=false;for(inti=0;i<n-1;i++){//外层循环,控制排序的轮数for(intj=0;j<n-i-1;j++){//内层循环,控制每轮比较的次数i......
  • [数据结构] 基于交换的排序 冒泡排序&&快速排序
    标题:[数据结构]基于交换的排序冒泡排序&&快速排序@水墨不写bug(图片来源于网络) 目录(一)冒泡排序优化后实现:(二)快速排序I、实现方法: (1)hoare法hoare法实现快排: (2)挖坑法挖坑法实现:(3)双指针法 双指针法实现:  II、快速排序复杂度分析:比较完备的快速排序实现如......
  • IAP 2023 Day1
    HTMLHTML是Hypertextmarkuplanguage(超文本标记语言),你可以理解为网页的结构。<!DOCTYPEhtml><html><head><title>ProfilePage</title><linkrel="stylesheet"href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta......
  • 代码随想录刷题day 4 | 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题
    24.两两交换链表中的节点迭代的版本:最重要的就是要知道循环变量怎么取,对于这道题,我们只需要存储需要交换的两个节点的前一个节点即可,只有当这个节点后面有两个节点时才进入循环,其实把握住这一点之后这题就非常容易了。递归的版本:这道题用递归做简直不要太简单,首先明白递归结束......
  • python随笔day02
    1.arg元组类型和**kwargs字典类型#元组参数:元组类型数据,对传递参数有顺序要求deftest(*args):print(f"args[0]={args[0]},args[1]={args[1]},args[2]={args[2]}")test(1,2,3)#字典参数:字典类型数据,对传递参数没有顺序要求,格式要求key=value值deftest2(**kwargs):......
  • JAVA学习day05
    继承supersuper();super调用父类的构造方法,且必须在构造方法的第一行。this();调用本类的构造方法。super只能出现在子类的方法或者构造方法中。super和this不能同时调用构造方法。this代表调用当前类的对象super代表调用父类的对象this在没有继承的情况下也能使用......
  • [未公开0day]宏景HCM人力资源信息管理系统存在前台RCE
    如果觉得该文章有帮助的,麻烦师傅们可以搜索下微信公众号:良月安全。点个关注,感谢师傅们的支持。payload就放在星球了,欢迎各位师傅来白嫖,看上眼的话可以留下试试。漏洞简介宏景人力资源管理系统是一款由宏景软件研发的系统,主要功能包括人员、组织机构、档案、合同、薪资、保险......