数据结构--插入排序

数据结构--插入排序

什么是排序?

排序:将无序序列排成一个有序序列的运算.

image-20230802095848034

排序的应用非常广泛.

image-20230802100121959

排序方法的分类

image-20230802100235445

按照储存介质分类.

内部排序:数据量不大,数据在内存,无序内外存交换数据.

外部排序:数据量较大,数据在外存(文件排序).

image-20230802100448963

按比较器个数分类

  1. 串行排序:单处理机(同一时刻比较一对元素)
  2. 并行排序:多处理机(同一时刻比较多对元素)

image-20230802100737661

按主要操作分为

比较排序:使用比较的方法排序

基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序位置.

image-20230802100951538

按辅助空间可分为

原地排序:辅助空间用量为O(1)的排序方法。
(所占的辅助存储空间与参排序的数据量大小无关)
非原地排序:捕助空间用量超过可的排序方法。

image-20230802101135137

按稳定性按分为:
稳定排序:能够使任何数值柚等的元素,排序以后相对次序不变。
非稳定性排序:不是稳定排序的方法。

image-20230802101152011

稳定排序:相对位置不发生改变

不稳定排序:相对位置发生改变

image-20230802101352639

排序的稳定性只对结构类型数据排序有意义。

image-20230802101544694

·按自然性可分为:
·自然排序:输入数据越有序,排序的速度越快的排序方法。
·非自然排序:不是自然排序的方法。

image-20230802101633557

重点学习

内部排序

串行排序

比较排序

基数排序

image-20230802101812945

存储结构--记录序列以顺序表存储

image-20230802102020979

插入排序

基本思想:

每步将一待排序的对象,按其关
键码大小,插入到前面己经排好序的一
组对象的适当位置上,直到对象全部插
入为止。

基本操作:有序插入.

image-20230803091816402

image-20230803091903483

插入元素在那里?

image-20230803092934525

插入排序的种类

image-20230803093136513

直接插入排序

image-20230803094029304

使用哨兵进行插入排序

image-20230803094408667

直接插入排序的算法实现

image-20230803094544594

直接插入排序的--性能分析

最好的情况

image-20230803094809233

最坏的情况

image-20230803095119157

平均情况

image-20230803095138734

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

image-20230803095236554

image-20230803095302548

代码实现

#include <bits/stdc++.h>
using namespace std;

/*
  排序下标从1到n的元素
 */
void insertsort(int a[], int n) {
	int i, j;
	for ( i = 2; i <= n; i++) { //从第二个位置开始插入排序
		if (a[i] < a[i - 1]) { //如果当前的位置小于前面的位置
			a[0] = a[i]; //复制a[i]到哨兵位置
			//从i-1位置开始寻找,直到a[0]<a[j]
			for ( j = i - 1; a[0] < a[j]; j--) {
				a[j + 1] = a[j];//每次将不符合的元素向后移动
			}
			a[j + 1] = a[0];//最后将相应的元素放入合适的位置
		}
	}
}
int main () {
	int a[] = {0, 8, 5, 4, 3, 2, 5, 2, 5};
	insertsort(a, 8);
	for (int i = 1; i <= 8; i++) {
		printf("%d ", a[i]);
	}
	printf("\n");

	return 0;
}

折半插入排序

查找插入位置时采用折半查找法

image-20230812103343176

算法描述

image-20230812103542987

折半查找比顺序查找快,所以折半插入排序就性能来说比直接插入排序要快

image-20230812103842973

直接插入排序和折半插入排序的元素移动次数相同

image-20230812104020596

希尔排序

可以增大移动的步幅吗?

希尔排序:比较一次,移动一大步.

image-20230812104251298

希尔排序算法:

  1. 缩小增量

  2. 多遍插入排序

image-20230812104454897

算法描述

image-20230812104907645

排序思路

image-20230812105019519

希尔排序特点

image-20230812105144033

希尔算法实现

image-20230812105304722

其中某一趟的排序操作

image-20230812105556872

希尔排序算法分析

采用不同的增量序列的算法效率.

image-20230812105919949

希排序是一种不稳定的排序算法.

image-20230812110052747

image-20230812110230897

排序方法的比较

image-20230812110255778

posted @   harper886  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示