蓝桥杯基础练习(1)---数列排序

2023-11-06

一、数列排序问题的解决

问题描述

  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200

输入格式

  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。

输出格式

  输出一行,按从小到大的顺序输出排序后的数列。

样例输入

5
8 3 6 4 9

样例输出

3 4 6 8 9

代码实现:(冒泡排序实现)

#include <stdio.h>

int main() {
	int n,i,j,temp;
	int a[200];
	
	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-1-i;j++)
		{
			if(a[j]>a[j+1])
			{
				temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		} 
	}
	
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

代码实现(qsort()函数实现)

#include<stdlib.h>
#include <stdio.h>


int Cmp(const void *a,const void *b){
	int x = *(int *)a;
	int y = *(int *)b;
	return x-y;
}//当然也可以直接return *(int*)a - *(int*)b;

int main() {
	int n=5,i,j,temp;
	int a[200];
	
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	} 
	qsort(a,n,sizeof(a[0]),Cmp);
	
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

二、交换排序

1、冒泡排序

(1)主要思想(以从小到大排序为例)

        1)设将需要排序的一组元素放入某个数组中,然后从第一个元素开始,与下一个元素进行比较,若为逆序,则交换;若正序,则继续进行下一次比较。通过这样一次比较,就把这组元素中的最大值交换到了最后一个位置,然后继续重复这个操作,直至实现要求。

        2)通过双重for循环(或者一个while循环,一个for循环)实现相邻元素的比较以及排序。

(2)冒泡法的几种实现代码

        1)双重for循环且第二个循环变量为递增

	for(i = 0;i < n;i++){
		for(j = 0;j < n-i-1;j++){
			if(a[j] > a[j+1]){
				int tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			}
		}
	}

        2)双重for循环且第二个循环变量为递减

	for(i = 0;i < n; i++){
		for(j=n-1;j >= i;j--){
			if(a[j] < a[j-1]){
				int tmp = a[j];
				a[j] = a[j-1];
				a[j-1] = tmp;
			}
		}
	} 
	

         3)一个while循环,一个for循环,且第二个循环变量为递增

	int flag = 1, i=0;//flag是用来标记某一次排序是否发生交换
	while(i<n&&flag==1){
		flag = 0;//flag置0,表示若某一趟没有发生交换,则不会进行下一次的排序
		for(j=0;j<n-i-1;j++){
			if(a[j] > a[j+1]){
				flag = 1;
				int tmp = a[j];
				a[j] = a[j+1];
				a[j+1] = tmp;
			}
		}
	} 

        4)一个while循环,一个for循环,且第二个循环变量为递减

                只需要将上述方法中的3)和4)结合一下就好了。

冒泡排序法是所有的排序方法中最简单的一个,只要理解了冒泡排序的思想,基本就可以写出来的。但是最主要的还是自己写,只有自己写了才知道自己哪里会出错,然后记下来,防止下次出错。

(3)冒泡排序法的效率分析

        1)时间复杂度:

最好情况:正序排列,这种情况不需要交换操作,只需要一次排序,n-1次比较操作,所以时间复杂度为O(n);

最坏情况:逆序排列,这种情况需要n-1次排序,比较次数就是达到最大值(以1为公差的1~n前n项和):O(n²),交换次数达到最大值(每次交换时移动3次记录,所以为3×以1为公差的1~n前n项和):O(n²),所以最坏时间复杂度为O(n²)。

        2)空间复杂度:只有在交换位置时需要一个临时辅助空间做暂存记录,所以为O(1)。

2、快速排序

(1)主要思想(以从小到大排序为例)

        1)在需要排序的一组元素中,设low指向第一个元素,high指向最后一个元素,并且随机找一个元素作为枢轴(一般都是设这些元素的第一个)。

        2)high的指向从右边开始向左移动,选取第一个比枢轴小的元素与枢轴的位置交换;然后low的指向从左边开始向右移动,选取第一个比枢轴大的元素与枢轴的位置交换。重复这两步操作,直至low与high相同,此时,这组元素被分为两个子表,枢轴左边的元素均小于枢轴元素,右边的元素大于枢轴元素,这算完成一次排序。

        3)重新选择一个新的枢轴,重复1)和2)操作,直到完成排序。

(2)快速排序法的实现代码

/*获取枢轴位置,并将数组分为两个子表(左边比枢轴元素小,右边比枢轴元素大)*/
int Partition(int a[],int low,int high){
	int pivot = a[low];
	while(low < high){ //high指针从后向前遍历,寻找第一个比枢轴元素小的元素与枢轴元素交换
		while(low < high && a[high] >= pivot){
            --high;//此处先减后用还是先用后减其实都可以 
        }
        a[low] = a[high]; 
            
       
        while(low < high && a[low] <= pivot){ //low指针从前向后遍历 ,寻找第一个比枢轴元素大的元素与枢轴元素交换
            ++low;
        }
        a[high] = a[low];
    }
    a[low] = pivot;
    return low; 
}
void QuickSort(int a[],int low,int high){
    if(low<high){  //递归出口 
        int pivot = Partition(a,low,high);
        QuickSort(a,low,pivot-1);  //比枢轴元素小的部分继续调用快速排序 
        QuickSort(a,pivot+1,high);   //比枢轴元素大的部分继续调用快速排序 
    } 
}

对于c++中头文件#include<stdlib.h>里面的qsort函数实质上完成了上述的这些操作,所以在会使用这个函数时,可以直接调用,用法在我优势洗牌的那个文章里面有说明,在上面数列排序的代码实现中也用到了。

(3)快速排序法的效率分析

  1)时间复杂度:

最好情况:每一趟排列后都能将记录序列分为两个长度大致相同的子表,此时的递归树就是一个二叉树,类似折半查找;在n个元素的序列中,对枢轴元素定位所需时间为O(n),所以此时时间复杂度大致为为O(nlog2n);

最坏情况:是已经排好序的情况,此时,其递归树为单支树,每次划分只能得到一个比上一次上一个的子序列,这种情况需要n-1趟才能将所有记录定位,而且第i趟需要经过、n-i次比较,所以最坏时间复杂度大致为O(n²)。

平均时间复杂度:O(nlog2n)。

        2)空间复杂度:快速排序是递归的,执行时需要有一个栈来存放相应的数据。最大递归调用次数与递归树的深度一致,所以说最好情况下的空间复杂度是O(log2n),最坏情况是O(n)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯基础练习(1)---数列排序 的相关文章

随机推荐

  • 如何从数组对象中拿到指定的数据格式,数组对象数据处理

    一 原始数据 result name book4 value 3 children name 你的名字 value 3 name 言叶之庭 value 5 name book5 value 3 children name 白夜行 value
  • selenium中获取页面元素方法介绍以及定位页面元素

    1 通过浏览器驱动获取 单个元素页面元素的8种方式 通过 id获取元素 el driver find element by id id 通过 name获取元素 el driver find element by name name 通过 c
  • 六、04【Java 多线程】之并发编程

    多线程并发编程 并行和并发的概念我们之前有提到过 在回顾下 并发 多个任务在同一个 CPU 核上 按细分的时间片轮流 交替 执行 从逻辑上来看那些任务是同时执行 并行 单位时间内 多个处理器或多核处理器同时处理多个任务 是真正意义上的同时进
  • 【华为OD机试】求最多可以派出多少支团队(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 题目描述 用数组代表每个人的能力 一个比赛活动要求参赛团队的最低能力值为N 每个团队可以由1人或2人组
  • 基于SpringBoot的疾病预防系统的设计与实现

    系统合集跳转 一 系统环境 运行环境 最好是java jdk 1 8 我们在这个平台上运行的 其他版本理论上也可以 IDE环境 Eclipse Myeclipse IDEA或者Spring Tool Suite都可以 tomcat环境 To
  • 一个div里有多个a标签,改变a标签的字体颜色方法

  • 抓包工具_Charles使用

    目录 1 Charles准备工作 2 Charles抓包原理 3 Charles抓包步骤 4 Charles抓包分析 5 Charles重发请求 1 Charles准备工作 Charles是一种抓包工具 和fiddler mitmproxy
  • tuts4you上lena‘s40个crackme(1)

    本来是不打算写文章了 因为懒 想以后通过录屏的形式保存一下自己学的路程 但奈何开学后一直没找到机会 在宿舍也不愿意大吼大叫的讲东西 只好再写写文章了 最近学了一些汇编语言和逆向工程 所以就想通过这40给题目来看一看成效 这篇文章是第一题 博
  • SpringMVC框架学习笔记整理-动力节点王鹤(无必详细)

    继续整理了Springmvc的学习笔记 动力节点王鹤老师讲的springmvc 分享给大家 看了这么多网上的视频 还是只有王鹤老师讲的能听明白 就喜欢讲的细的 而且老师条理很清晰 视频资源 https www bilibili com vi
  • 对MRTK中HandInteractionExamples实例的一些理解

    文章目录 前言 一 按钮 二 边界框 三 操作示例 四 滑动条 五 其它 前言 对HoloLens实例的一些浅陋的理解 大部分为官方自己解释 一 按钮 BoxCollider 按钮前板的Box Collider PressableButto
  • 欧莫,github一看就懂【纯小白】

    教程 一看就懂 Github基础教程 哔哩哔哩 bilibili 分享原因 一不小心刷到的 对小白来说真的很友好 因为我也被github上的英文吓到过 突然刷到这样简单直白的介绍 忍不住分享一波u 2 giehub免费加速 教程 手把手教你
  • 语音端点检测(Voice Activity Detection,VAD)

    本文内容均翻译自这篇博文 该博主的相关文章都比较好 感兴趣的可以自行学习 Voice Activity Detection VAD Tutorial 语音端点检测一般用于鉴别音频信号当中的语音出现 speech presence 和语音消失
  • Java PrintWriter.write()方法具有什么功能呢?

    转自 Java PrintWriter write 方法具有什么功能呢 下文讲述java中PrintWriter write 方法的功能简介说明 如下所示 PrintWriter write 方法的功能 同print方法基本一致 print
  • 模式识别(1)协方差矩阵相关和K-means聚类算法实现(含源码)

    模式识别实验一 实验一 协方差矩阵和矩阵特征值 特征向量的计算 题目简介 给定一组数据 实现该组数据的协方差矩阵的计算 并用代码实现计算一个方阵的特征值和特征向量 一 协方差部分 1 协方差的定义 协方差在概率论和统计学中用于衡量两个变量的
  • java-maven的使用

    一 加载maven项目 1 idea工具栏file open 选择项目加载进来 2 右键pom xml 选择add as maven project 3 如果在pom xml上的某个依赖一直报红且依赖本身没有问题 本pom其他的依赖也没有问
  • 面试概率题目

    概率题目 现在的面试中 大部分公司都会问道概率相关的问题 我们现在给出几道常见的概率问题 1 三角形问题 题目 给你一根铅笔 将铅笔折两次 组成三角形的概率是多大 解析 设 铅笔长度是1 折两次之后 得到三条边 对应的长度分别是x y 1
  • css3实现动画的三种方式

    css实现动画主要有3种方式 第一种是 transition实现渐变动画 第二种是 transform转变动画 第三种是 animation实现自定义动画 transition渐变动画 过渡 语法格式 transition 要过渡的属性 花
  • win10 凭据管理

    点击WIN10左下角的开始选项 选择所有程序 找到WINDOWS系统 点开找到控制面板 打开控制面板 找到里面的 凭据管理器 打开凭据管理器 找到 WINDOWS凭据 然后点击 添加WINDOWS凭据 进入凭据添加页面 添加WINDOWS凭
  • 图像分割中的损失函数

    图像分割中的损失函数 文章目录 图像分割中的损失函数 前言 一 交叉熵损失 二 Dice loss 三 Focal loss 四 IOU损失函数 总结 前言 在深度学习中 所有算法都依赖于最小化或最大化一个函数 称之为损失函数 损失函数用于
  • 蓝桥杯基础练习(1)---数列排序

    一 数列排序问题的解决 问题描述 给定一个长度为n的数列 将这个数列按从小到大的顺序排列 1 lt n lt 200 输入格式 第一行为一个整数n 第二行包含n个整数 为待排序的数 每个整数的绝对值小于10000 输出格式 输出一行 按从小