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

【数据结构】排序——插入排序,选择排序

前言

本篇博客我们正式开启数据结构中的排序,说到排序,我们能联想到我之前在C语言博客中的冒泡排序,它是排序中的一种,但实现效率太慢,这篇博客我们介绍两种新排序,并好好深入理解排序

💓 个人主页:小张同学zkf

⏩ 文章专栏:数据结构

      若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章 ​

 

 

目录

 1.排序

1.1排序的概念

1.2排序的常见算法

2.插入排序

3.选择排序


 

 1.排序

1.1排序的概念

排序 :所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
稳定性 :假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j] ,且 r[i] r[j] 之前,而在排序后的序列中, r[i] 仍在 r[j] 之前,则称这种排序算法是稳定的;否则称为不稳定的。
内部排序 :数据元素全部放在内存中的排序。
外部排序 :数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。

 


1.2排序的常见算法


2.插入排序

即冒泡排序外,我们来认识一下一个新的排序

直接插入排序是一种简单的插入排序法,其基本思想是:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列
实际中我们玩扑克牌时,就用了插入排序的思想

 

我们来看一下动图

 

如何用代码实现出来这个插入排序那

我们观察动图其实可以看到假如一趟0~end数是有序的,那么end+1的数得挨个与0~end数比较,比较若比end+1的数大,向右移一位,继续与下一位比较,若比end+1的数小,就插在这个数的前面,进行下一趟重复此过程

代码如下

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void charupaixu(int* a, int x)
{for (int i = 0; i < x - 1; i++){int end =i;int tmp = a[end + 1];while (end >= 0){if (a[end] > tmp){a[end+1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}
int main()
{int arr[] = { 2,4,89,23,987,123,5678,13,76,67,6666};charupaixu(arr, sizeof(arr) / sizeof(arr[0]));for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;
}

这个排序的时间复杂度O(N)为N^2,但相比冒泡效率还是快的


3.选择排序

 选择排序其实思路特别简单,通过最前面与最后面的指针进行遍历找到最大的与最小的,将最小的与开头的数交换,最大的与最后面的数交换,再两边指针减减,重复此过程

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void swap(int* as, int* aq)
{int tmp = *as;*as = *aq;*aq = tmp;
}
void xuanzepaixu(int* a, int n)
{int begin = 0;int end = n-1;while (begin < end){int max = begin;int min = begin;for (int i = begin+1; i <= end; i++){if (a[min] > a[i]){min = i;}if (a[max] < a[i]){max = i;}}swap(&a[min], &a[begin]);if (begin == max){max = min;}swap(&a[max], &a[end]);begin++;end--;}
}
int main()
{int arr[] = { 34,56,56,87,7644,79,382,4657,272687,246581,6341,346345,5,267,7,22,2724,57 };xuanzepaixu(arr, sizeof(arr) / sizeof(arr[0]));for (int i = 0; i < sizeof(arr) / sizeof(0); i++){printf("%d ", arr[i]);}return 0;
}

但要注意,将最小数与开头数交换,此刻有可能最大数就是开头数,如果是这种情况,我们要刷新一遍最大值,然后再将最大值与结尾互换。

选择排序的时间复杂度也是O(N^2)但是比效率比冒泡还要低,综上三个排序,插入排序目前最优


结束语 

这篇博客先介绍三个排序,与之前的冒泡排序已经有四个,但这些还都是太慢,其中之一的插入排序一定要好好掌握,下片博客的希尔排序要用到插入排序的思维

OK,本篇博客结束!!!

 

相关文章:

  • [Cloud Networking] Layer 2
  • NineData云原生智能数据管理平台新功能发布|2024年5月版
  • 联合体和枚举<C语言>
  • 卡尔曼滤波器例子
  • MathType7.8永久破解版下载 让数学学习变得简单有趣!
  • 为什么Kubernetes(K8S)弃用Docker:深度解析与未来展望
  • 微信小程序学习笔记(4)
  • 【AI 高效问答系统】机器阅读理解实战内容
  • Vue3+TS 开发 Google 浏览器插件模板
  • 计算机网络 —— 网络层 (路由协议)
  • 计算机网络 ——网络层(IPv4地址)
  • ThreadCache线程缓存
  • linux install cmake3.22
  • Apache POI(使用Java读写Excel表格数据)
  • Flutter 中的 ListWheelViewport 小部件:全面指南
  • hexo+github搭建个人博客
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [笔记] php常见简单功能及函数
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Apache的基本使用
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • magento 货币换算
  • nfs客户端进程变D,延伸linux的lock
  • Terraform入门 - 1. 安装Terraform
  • ViewService——一种保证客户端与服务端同步的方法
  • windows下使用nginx调试简介
  • Zepto.js源码学习之二
  • 阿里云应用高可用服务公测发布
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 两列自适应布局方案整理
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​人工智能书单(数学基础篇)
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • # 数据结构
  • #### go map 底层结构 ####
  • (0)Nginx 功能特性
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (篇九)MySQL常用内置函数
  • (三)模仿学习-Action数据的模仿
  • (一)SpringBoot3---尚硅谷总结
  • (转)linux下的时间函数使用
  • ****Linux下Mysql的安装和配置
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .java 9 找不到符号_java找不到符号
  • .mysql secret在哪_MySQL如何使用索引
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .Net Core 中间件验签
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .Net MVC4 上传大文件,并保存表单