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

八大排序 (上)

文章目录

  • 一、 直接插入排序
    • 1.概念
    • 2.直接插入排序的实现
    • 直接插入排序的时间复杂度
  • 二、 希尔排序
    • 1.概念
    • 2. 希尔排序的实现
    • 3. 希尔排序的时间复杂度
  • 三、 直接选择排序
    • 1.直接选择排序的实现
    • 2.注意事项
    • 3.直接选择排序的时间复杂度
  • 四、 堆排序
  • 五、冒泡排序
    • 1.冒泡排序的实现
    • 2.冒泡排序的时间复杂度
    • 3.冒泡排序与直接插入排序谁更好?

一、 直接插入排序

1.概念

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列

2.直接插入排序的实现

void insertsort(int* a, int sz)//直接插入排序   [0 end]有序,插入end+1位置的值让[ 0 end+1]也有序
{
	int i = 0;//假设我们要排升序
	for (i = 0; i < sz - 1; i++)//i不能取到sz-1 否则tmp就会造成越界访问
	{
		int end = i;
		int tmp = a[end + 1];//后一个数据
		while (end >= 0)
		{
			if (a[end] > tmp)//如果数组中的数据大于tmp
			{
				a[end+1] = a[end];
				end--;
			}
			else
			{
				break;//找到比tmp小的就结束循环
			}
		}
		a[end + 1] = tmp;//为了防止tmp比所有数据都小这种情况发生
	}
	
}

在这里插入图片描述

直接插入排序的时间复杂度

在这里插入图片描述

二、 希尔排序

1.概念

思想为 :先选定一个整数,把 待排序文件中所有记录分组,所有距离内的记录在同一组中,再对每一组内的记录进行排序,重复分组和排序, 直到=1时结束.

希尔是直接插入排序的优化
1.先进行预排序,让数组接近有序
2.直接插入排序

在这里插入图片描述

此时发现: 多组间隔为gap的预排序,gap由大变小
gap 越大,大的数越快到后面,小的数越快到前面
gap越大,预排完,越不接近有序,
gap越小,预排完,越接近有序
当gap=1时,就时直接插入排序

2. 希尔排序的实现

void shellsort(int* a, int n)//希尔排序
{
	int i = 0;
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1; //间隔为gap的多组数据同时排
		for (i = 0; i < n - gap; i++)//如果gap换成1  那就是直接插入排序
		{
			int end = i;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;
		}
	}
}

3. 希尔排序的时间复杂度

  1. gap=n , gap=gap/3+1 即 n=n/3+1
    假设 x为操作次数 3^x=n+1 x=log 3 n+1
    时间复杂度为 O(log 3 N)

2.预排序会使数组接近有序 ,如gap=1 时 ,就为直接插入排序,时间复杂度为O(N)
在这里插入图片描述

希尔排序 整体时间复杂度为O(N *log 3 N )

三、 直接选择排序

1.直接选择排序的实现


void selectsort(int arr[], int n)//直接选择排序
{
	int begin = 0;
	int end = n - 1;
	while (begin < end)
	{

		int max = begin;
		int min = begin;
		int i = 0;
		for (i = begin; i <= end; i++)
		{
			if (arr[i] < arr[min])
			{
				min = i;//通过交换找到最大值坐标
			}
			if (arr[i] > arr[max])
			{
				max = i;//通过交换找到最小值坐标
			}
		}
		swap(&arr[begin], &arr[min]);//通过坐标将最小值交换到第begin个
		if (begin == max)
		{
			max = min;
		}
		swap(&arr[end], &arr[max]);//通过坐标将最大值交换到第end个
		begin++;
		end--;
	}
}

在这里插入图片描述

2.注意事项

在这里插入图片描述

3.直接选择排序的时间复杂度

直接选择排序 ,无论 数组处于 有序 (最好情况下),还是无序 (最坏情况下) 都需要将整个数组遍历一遍 ,
时间复杂度为O(N^2)

四、 堆排序

点击这里 :堆排序详解

五、冒泡排序

1.冒泡排序的实现

void bubblesort(int* a, int sz)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz - 1; i++)// i代表趟数  i在倒数第二次就已经把数组排好了 
	{
		int exchange = 0;
		for (j = 0; j < sz - 1 - i; j++)//j代表每趟的对数 
		{
			if (a[j] > a[j + 1])
			{
				int tmp = 0;
				tmp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = tmp;
				exchange = 1;
			}
		}
		if (exchange == 0)//说明遍历一遍都没有进行比较,则有序
		{
			break;
		}
	}
}

在这里插入图片描述

2.冒泡排序的时间复杂度

正常情况下:
第一趟时,共比较 n-1次 ,
第二趟时,共比较n-2 次,
第n-1趟时,共比较1次
操作次数为: n-1+n-2+n-3+…+1=n(n-1)/2
通过大O渐进法省略 ,时间复杂度为O(N^2)

最好情况下:
数组为有序时 ,如 : 1 2 3 4 5
正好排升序,遍历一遍后发现并没有进入交换中,exchange==0则跳出循环。
时间复杂度为O(N)

3.冒泡排序与直接插入排序谁更好?

当数组接近有序时 ,如: 1 2 3 5 4 6
1.冒泡排序:
在这里插入图片描述

2.直接插入排序:
1 2 3 5 4 6
在这里插入图片描述
时间复杂度为O(N)

则直接插入排序更优

相关文章:

  • 第一讲:如何使用go-client连接k8s
  • rac节点停止和启动
  • NFS使用-动态供应
  • SAP Commerce Cloud ASM 模块的登录过程
  • 数据库迁移-国产化-迁移建议-GreenPlum DB向GBase 8a 迁移
  • Python Flask MongoDB Web开发:前 言
  • element-ui 组件库 button 源码分析
  • 二、学习Lua 环境安装
  • 本地快速部署 TiDB 集群
  • “金九银十”这几天刚整理出炉的两份最全“Java 面试宝典+Java 核心知识集”
  • python笔记Ⅴ--元组、字典、集合
  • 力扣 307. 区域和检索 - 数组可修改
  • Java的Lambda表达式学习笔记
  • DLG4NLP
  • 在 C# CLR 中学习 C++ 之了解 extern
  • 【Leetcode】101. 对称二叉树
  • 30秒的PHP代码片段(1)数组 - Array
  • Android Volley源码解析
  • canvas 高仿 Apple Watch 表盘
  • CentOS6 编译安装 redis-3.2.3
  • ES6语法详解(一)
  • gulp 教程
  • Java 网络编程(2):UDP 的使用
  • jquery ajax学习笔记
  • laravel with 查询列表限制条数
  • Linux链接文件
  • Redis学习笔记 - pipline(流水线、管道)
  • Terraform入门 - 3. 变更基础设施
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 类orAPI - 收藏集 - 掘金
  • 前嗅ForeSpider采集配置界面介绍
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 我感觉这是史上最牛的防sql注入方法类
  • 我这样减少了26.5M Java内存!
  • 学习Vue.js的五个小例子
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (超详细)语音信号处理之特征提取
  • (二)PySpark3:SparkSQL编程
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (论文阅读11/100)Fast R-CNN
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • ***测试-HTTP方法
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .Net接口调试与案例
  • .NET框架设计—常被忽视的C#设计技巧
  • .py文件应该怎样打开?