C++经典排序算法详解

news2024/11/28 8:37:13

目录

一、选择排序

二、冒泡排序

三、插入排序

一、选择排序

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。

算法描述

在这里插入图片描述

代码模板 

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
int main()
{
	int n, a[1005];
	scanf("%d", &n);
	
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	
	for(int i = 1; i < n; i++)
	{
		for(int j = i + 1; j <= n; j++)
		{
			if(a[i] > a[j])
				swap(a[i], a[j]);
		}
	}
	
	for(int i = 1; i <= n; i++)
		printf("%d ", a[i]);
	
	return 0;
} 

二、冒泡排序

何谓冒泡排序法

(1)两两比较相邻元素A(I)和A(I+1)(I=1,2,…N-1),如果A(I)>A(I+1),则交换A(I)和A(I+1)的位置;

(2)对剩下的N-1个元素,再两两进行比较,按同样规则交换它们的位置,经过N-2次比较,将次最大值交换到A(N-1)的位置;

(3)如法炮制,经过N-1趟的“冒泡处理”,每趟进行N-i次的比较,全部数列有序。

算法描述

算法描述

有两种方法去写,但时间复杂度不同,普通方法为O(n方),优化后为O(nlogn)。

代码模板

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
int main()
{
	int n, a[1005];
	scanf("%d", &n);
	
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	

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

优化后

#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
int main()
{
	int n, a[1005];
	scanf("%d", &n);
	
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	

    for (int i = 1; i < n; i++)
	{
		bool flag = false;
		
        for (int j = 1; j <= n - i; j++)
	    {
            if (a[j] > a[j + 1]) 
            {
            	swap(a[j], a[j + 1]);
            	flag = true;
			}
        }
        
        if(!flag)
        	break;
    }
	
	for(int i = 1; i <= n; i++)
		printf("%d ", a[i]);
	
	return 0;
}

三、插入排序

直接插入排序

最差时间复杂度:O(n^2)
最优时间复杂度:O(n)
平均时间复杂度:O(n^2)
稳定性:稳定

直接插入排序(Insertion Sort),是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对未排序的数据,在已排序序列中从后向前扫描,找到相应位置并插入。
插入排序算法的一般步骤:
1.从第一个元素开始,该元素可以认为已被排序;
2.取出下一个元素,在已经排序的元素序列中从后向前扫描;
3.如果该元素(已排序)大于新元素,将该元素移到下一个位置;
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
5.将新元素插入到该位置后,重复2~5


算法描述

 有两种方法去写,直接插入排序与二分插入法

代码模板

直接插入排序

#include <iostream>
#include <cstdio>
#define ll long long 
using namespace std;

int a[10005], n;

void sorting(int x)
{
	int i, tmp = a[x], t = 0;
	
	for(i = x - 1; i >= 1; i--)
	{
		if(a[i] > tmp)
			a[i + 1] = a[i];
		else
			break;
	}
	
	a[i + 1] = tmp;
}

int main()
{
	scanf("%d", &n);

	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	
	for(int i = 2; i <= n; i++)
		sorting(i);
	
	for(int i = 1; i <= n; i++)
		printf("%d ", a[i]);
	
	return 0;
}

二分插入法

#include <iostream>
#include <cstdio>
#define ll long long 
using namespace std;

int a[10005], n;

void sorting()
{
    int i, j, f, left, mid, right;
    
    for(i = 1; i <= n; i++)
	{
	    f = a[i];
	    left = 0;                       
        right = i - 1;
        
		while(left <= right)
		{
            mid = (left + right) / 2;
            
            if(a[mid] < f)
                left = mid + 1;             
            else
                right = mid - 1;           
        }
        
        for(j = i - 1; j >= left; j--)
    		a[j + 1] = a[j];
    	
    	a[left] = f;
	}
}

int main()
{
	scanf("%d", &n);

	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	
	sorting();
	
	for(int i = 1; i <= n; i++)
		printf("%d ", a[i]);
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/843836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux命令200例:join将两个文件按照指定的键连接起来分析

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

十二、ESP32控制步进电机

1. 运行效果 2. 步进电机 最大特点:能够控制旋转一定的角度 3. 步进电机原理

P1433 吃奶酪(状态压缩dp)(内附封面)

吃奶酪 题目描述 房间里放着 n n n 块奶酪。一只小老鼠要把它们都吃掉&#xff0c;问至少要跑多少距离&#xff1f;老鼠一开始在 ( 0 , 0 ) (0,0) (0,0) 点处。 输入格式 第一行有一个整数&#xff0c;表示奶酪的数量 n n n。 第 2 2 2 到第 ( n 1 ) (n 1) (n1) 行…

研发工程师玩转Kubernetes——emptyDir

kubernets可以通过emptyDir实现在同一Pod的不同容器间共享文件系统。 正如它的名字&#xff0c;当Pod被创建时&#xff0c;emptyDir卷会被创建&#xff0c;这个时候它是一个空的文件夹&#xff1b;当Pod被删除时&#xff0c;emptyDir卷也会被永久删除。 同一Pod上不同容器之间…

报错Error: error:0308010C:digital envelope routines::unsupported

Error: error:0308010C:digital envelope routines::unsupported 解决&#xff1a; 在原有脚本前加&#xff1a; SET NODE_OPTIONS--openssl-legacy-provider && 原来&#xff1a; 加后&#xff1a;

常规VUE项目优化实践,跟着做就对了!

总结&#xff1a; 主要优化方式&#xff1a; imagemin优化打包大小&#xff08;96M->50M&#xff09;&#xff0c;但是以打包速度为代价&#xff0c;通过在构建过程中压缩图片来实现&#xff0c;可根据需求开启。字体压缩&#xff1a;目前项目内引用为思源字体&#xff0c…

Latex安装与环境配置(TeXlive、TeXstudio与VS code的安装)编译器+编辑器与学习应用

TeXlive 配置Tex排版系统需要安装编译器+编辑器。TeX 的源代码是后缀为 .tex 的纯文本文件。使用任意纯文本编辑器,都可以修改 .tex 文件:包括 Windows 自带的记事本程序,也包括专为 TeX 设计的编辑器(TeXworks, TeXmaker, TeXstudio, WinEdt 等),还包括一些通用的文本编…

对于git功能的探索与研究

读前提示 注意&#xff1a; 本文只是面向初学者或者之前并未接触过git而想学习如何初步使用git的读者&#xff0c;如果您很擅长使用git&#xff0c;并善于维护远程仓库&#xff0c;那么不建议您看此篇文章&#xff0c;这会浪费您的时间。 当然&#xff0c;这篇文章还是能很好地…

配置页面的路由

1.下载router npm i router 2.注册路由 文件路径 &#xff1a;src/router/index.js import Vue from "vue"; import VueRouter from "vue-router"; Vue.use(VueRouter); import Home from "../components/home.vue"; import Main from …

摄像机终端IP地址白名单配置流程

海康摄像头配置白名单流程 1.登录海康摄像机前端 2.进入配置-系统-安全管理-IP地址过滤 3.IP地址过滤方式选择“允许” 4.点击添加按钮输入对应的IP地址或者IP网段 5.最后勾选启用IP地址过滤&#xff0c;然后保存 大华摄像头配置白名单流程 1.登录大华摄像机前端 2.进入设…

openGauss学习笔记-33 openGauss 高级数据管理-视图

文章目录 openGauss学习笔记-33 openGauss 高级数据管理-视图33.1 语法格式33.2 参数说明33.3 示例 openGauss学习笔记-33 openGauss 高级数据管理-视图 视图与基本表不同&#xff0c;是一个虚拟的表。数据库中仅存放视图的定义&#xff0c;而不存放视图对应的数据&#xff0c…

【C高级】Day4 shell脚本 排序

1. 整理思维导图 2. 写一个函数&#xff0c;获取用户的uid和gid并使用变量接收 #!/bin/bash function getid() {uidid -ugidid -g }getid echo "uid$uid" echo "gid$gid"3. 整理冒泡排序、选择排序和快速排序的代码 #include <myhead.h>void Inp…

智慧物流园区整体架构方案【46页PPT】

导读&#xff1a;原文《智慧物流园区整体架构方案【46页PPT】》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式&#xff1a; 如需获取…

Python-面向对象:面向对象、成员方法 、类和对象、构造方法、魔术方法、封装、继承、类型注解、多态(抽象类(接口))

版本说明 当前版本号[20230806]。 版本修改说明20230806初版 目录 文章目录 版本说明目录知识总览图面向对象初识对象生活中数据的组织程序中数据的组织使用对象组织数据 成员方法类的定义和使用成员变量和成员方法成员方法的定义语法注意事项 类和对象现实世界的事物和类使…

Netty:ChannelInitializer添加到ChannelPipeline完成任务以后会自动删除自己

说明 io.netty.channel.ChannelInitializer是一个特殊的ChannelInboundHandler。它的主要作用是向 Channel对应的ChannelPipeline中增加ChannelHandler。执行完ChannelInitializer的initChannel(C ch)函数以后&#xff0c;ChannelInitializer就会从ChannelPipeline自动删除自己…

sklearn中使用决策树

1.示例 criterion可以是信息熵&#xff0c;entropy&#xff0c;可以是基尼系数gini # -*-coding:utf-8-*- from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split wineload_wine()# print ( wine.feature_…

Vue3 第四节 自定义hook函数以及组合式API

1.自定义hook函数 2.toRef和toRefs 3.shallowRef和shallowReactive 4.readonly和shallowReadonly 5.toRaw和markRaw 6.customref 一.自定义hook函数 ① 本质是一个函数&#xff0c;把setup函数中使用的Composition API 进行了封装,类似于vue2.x中的mixin 自定义hook函数…

Maven介绍-下载-安装-使用-基础知识

Maven介绍-下载-安装-使用-基础知识 Maven的进阶高级用法可查看这篇文章&#xff1a; Maven分模块-继承-聚合-私服的高级用法 文章目录 Maven介绍-下载-安装-使用-基础知识01. Maven1.1 初识Maven1.1.1 什么是Maven1.1.2 Maven的作用 02. Maven概述2.1 Maven介绍2.2 Maven模型…

F5 LTM 知识点和实验 12-使用规则和本地流量策略定制应用程序交付

第十一章:iapp(忽略) 第十二章:使用规则和本地流量策略定制应用程序交付 用最简单的术语来说,iRule是在网络流量通过BIGIP系统时对其执行的脚本。其思想非常简单:规则使您能够编写简单的网络感知代码片段,这些代码以各种方式影响您的网络流量。无论您是希望以BIG-IP内置…

SpringBoot 自动配置--常用配置

&#x1f600;前言 本篇博文是关于SpringBoot 自动配置的一些分享&#xff0c;希望能够帮助到您&#x1f60a; &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您…