当前位置: 首页 > article >正文

【C语言零基础入门篇 - 17】:排序算法

文章目录

  • 排序算法
    • 排序的基本概念
    • 冒泡排序
    • 选择排序
    • 插入排序

排序算法


排序的基本概念

1、什么是排序?
排序是指把一组数据以某种关系(递增或递减)按顺序排列起来的一种算法。

例如:数列 8、3、5、6、2、9、1、0、4、7

递增排序(升序)后 0、1、2、3、4、5、6、7、8、9

递减排序(降序)后 9、8、7、6、5、4、3、2、1、0

2、排序的稳定性
如果在一组需要排序的数据序列中,数据ki和kj的值相同,即ki= =kj,且在排序前ki在序列中的位置领先于kj,那么当排序后,如果ki和kj的相对前后次序保持不变,即ki仍然领先于kj,则称此类排序算法是稳定的。如果ki和kj的相对前后次序变了,即kj领先于ki了,则称此类排序算法是不稳定的

3、排序的过程
排序的过程中需要进行如下两种基本操作:
(1)比较两个数据的大小;
(2)移动两个数据的位置。

冒泡排序

冒泡排序(从小到大):
原始数据:8、6、5、4、9、7、1、2、3
冒泡一趟:6、5、4、8、7、1、2、3、9
特点:最大的数据会排在最后。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

void BubbleSort(int arr[], int n)//n表示元素个数 从小到大排序
{
	//冒泡趟数 n-1趟
	for (int i = 0; i < n - 1; i++)
	{
		for (int j = 0; j <= n - 1 - i; j++) //把最大的元素排序在最后
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j + 1];//temp临时保存数据容器
				arr[j + 1] = arr[j];
				arr[j] = temp;
			}
		}
	}
}

选择排序

一个序列进行选择排序,首先通过一轮循环比较,从n个数据中找出最大或者最小的那个数据的位置,然后按照递增或者递减的顺序,将此数据与第一个或最后一个数据进行交换。然后再找第二大或者第二小的数据进行交换,以此类推,直到序列全部有序为止。

选择排序与冒泡排序的区别在于,冒泡排序每比较一次后,满足条件的数据就交换,而选择排序是每次比较后,记录满足条件数据的位置,一轮循环过后再作交换。
在这里插入图片描述

//选择排序
void SelectSort(int arr[], int n)
{
	//n-1趟
	int min = 0;
	for (int i = 0; i < n-1; i++)//i表示当前最小元素的要在的下标值
	{
		min = i; //保存下标值
		for (int j = i + 1; j <= n; j++)//找到当前元素里的最小值
		{
			if (arr[min] > arr[j])
			{
				min = j;
			}
		}
		int temp = arr[min];
		arr[min] = arr[i]; 
		arr[i] = temp;
	}
}

插入排序

插入排序的规则是:第一轮开始时默认序列中第一个数据是有序的,之后各个数据以此为基准,判断是插入在此数据的前面还是后面,之后的数据依次向后移动,腾出位置,让数据插入,以此类推,直到整个序列有序为止。每比较一次,如果满足条件(升序:前面一个数比后面需要插入的数大),就直接交换。

特点:对基本有序的序列插入排序速度相对而言比较快,插入排序的优势越明显,数据量越多,劣势也越明显。
在这里插入图片描述
在这里插入图片描述

//插入排序
void InsertSort(int arr[], int n)
{
	int j = 0, i = 0;
	for (j = 1; j <= n; j++)
	{
		i = j - 1;
		int temp = arr[j];
		//如果有序部分的数据,比temp大,往后移一位
		while (i >= 0 && arr[i] > temp) //有序部分数据遍历从右到左
		{
			arr[i + 1] = arr[i];
			i--;
		}
		arr[i + 1] = temp;
	}
}

http://www.kler.cn/news/324006.html

相关文章:

  • ubuntu系统下,c++图形库Matplot++配置
  • 深度学习(3):Tensor和Optimizer
  • 求职Leetcode题目(11)
  • 如何使用C语言接入Doris数据库
  • 线性表二——栈stack
  • 微信小程序开发系列之-在微信小程序中使用云开发
  • How to install JetBrains ToolBox in Ubuntu 22.04 LTS?
  • ELK-03-skywalking监控linux系统
  • JAVA JDK华为云镜像下载,速度很快
  • AIGC入门:Comfyui整合包,解压即用!
  • Goweb---Gorm操作数据库(二)
  • project_object_model_3d
  • ES6中迭代器与生成器知识浅析
  • Python知识点:如何使用Python与.NET进行互操作(IronPython)
  • ubuntu 安装harbor
  • 解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
  • HI3520DV510 22AP80/SS522V100 芯片及开发板
  • 认识 Linux操作系统
  • 新疆交投路桥桥梁公司:向“新”求“质”,积蓄发展新势能
  • Tkinter制作登录界面以及登陆后页面切换(一)
  • Linux 基本指令的学习
  • 【深度学习】03-神经网络 3-3 梯度下降的优化方法-动量算法Momentum
  • mysql数据库sql语句总结
  • 综合业务区的数字化创新与智能化蓝图
  • GitLab CI/CD脚本入门
  • 04_OpenCV图片缩放
  • 先进制造aps专题二十六 基于强化学习的人工智能ai生产排程aps模型简介
  • Oracle 数据库安装和配置指南(新)
  • 进阶SpringBoot之分布式系统与 RPC 原理
  • 数据结构:成员运算符(.)+ 指向运算符(->)