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

【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.mrgr.cn/news/33920.html

相关文章:

  • from sklearn.preprocessing import Imputer.处理缺失数据的工具
  • 世界坐标系、相机坐标系、图像物理坐标系、像素平面坐标系
  • Python---re模块(正则表达式)
  • 国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?
  • 解决msvcr100.dll丢失的方法,5个实测可靠的解决方法
  • conda 启动时添加执行脚本
  • PHP isset() 和 empty() 区别
  • 【C++】继承(上)
  • 定了,东湖高新区下半年中高级职称申报时间
  • java日志框架之Log4j
  • Golang | Leetcode Golang题解之第430题扁平化多级双向链表
  • C++标准库双向链表 list 中的insert函数实现。
  • C++离线查询
  • Golang | Leetcode Golang题解之第429题N叉树的层序遍历
  • Codeforces Round 969 (Div. 1) C. Eri and Expanded Sets(线段树维护差分数组gcd+双指针+尺取)
  • git-repo系列教程(4) windows平台下安装git-repo客户端
  • Leetcode 每日一题:Diameter of Binary Tree
  • AI教你学Python 第18天 : 线性数据结构
  • 程序员如何保持与提升核心竞争力
  • Study Plan For Algorithms - Part35
  • 快速了解使用路由器
  • 证书学习(五)Java实现RSA、SM2证书颁发
  • 【学习笔记】手写 Tomcat 五
  • Python | Leetcode Python题解之第430题扁平化多级双向链表
  • YOLO航拍车辆和行人识别
  • 实战篇 | WSL迁移Linux系统到非系统盘(完整实操版)