保研复习数据结构记(8)--排序

news2024/11/25 6:49:28

一.内部排序

1.概念

  • 什么是排序?是将一个任意排列的记录或者是数据元素,排列成按关键字有序的序列
  • 什么是排序方法是稳定的?按照关键字排序的ki=kj,在排序之后,两个关键字相等的记录的顺序与排序之前相同,若相反,则称为关键字是不稳定的。
  • 什么是内部排序?指的是待排序记录序列存放在计算机内存随机存储器序列中
  • 什么是外部排序?指的是待排序记录数量太多,一部分存放在外存中,在排序时需要进行存取磁盘操作。

2.插入排序

插入排序算法简单,适合记录数量少进行排序,不适合数量大的元素进行排序。

(1)直接插入排序Straight Insertion Sort
  • 什么是直接插入排序?将一个记录插入到已排好序的有序序列中,如果采用顺序表存储方式存储的话,插入后需要后移元素,如果改进效率可以使用折半插入。
  • 直接插入排序的时间复杂度是多少?O(n^{2})
  • 代码?

首先给出数据元素的定义

typedef int keytype;//为了方便定义整型 
#define maxsize 10
typedef struct{
	keytype key;//关键字数据项 
	keytype otherinfor;//其他数据项 
}elemtype; 
typedef struct{
	elemtype r[maxsize+1];//第一个元素用作临时存储
	int length=0; 
}Sqlist;
void straightSort(Sqlist L)
{
	for(int i=2;i<=L.length;++i)
	{
		if(L.r[i-1].key>L.r[i].key)
		{
			L.r[0].key=L.r[i].key;//存放待插元素
			L.r[i].key=L.r[i-1].key;//先后移一位元素,这也是后移向前插的开始 
			int j;
			for(j=i-2;L.r[0].key<L.r[j].key;--j)
			{
				L.r[j+1].key=L.r[j].key; 
			}
			L.r[j+1]=L.r[0];//插入到正确位置,因为r[j]不小于r[0]所以,0存在j的后面j+1 
		}
	}
	OutPut(L);
}
 (2)希尔排序Shell's Sort
  • 什么是希尔排序?基本思想是先将整个记录序列分割成若干子序列分别对若干子序列进行插入排序,逐渐缩小分割增量,待整个序列“基本有序”时,再整体进行一次插入排序。
void shellInsert(Sqlist L,int dk)
{
	//前后记录增量位置为dk 
	for(int i=dk+1;i<=L.length;++i)
	{
		if(L.r[i].key<L.r[i-dk].key)
		{
			L.r[0].key=L.r[i].key;//存放要插入的元素
			int j;
			for(j=i-dk;j>0&&L.r[0].key<L.r[j].key;j-=dk)
			{
				L.r[j+dk]=L.r[j];//向后移动	
			} 
			L.r[j+dk]=L.r[0];//后移之后把元素赋值 
		}
	}	
} 
void shellSort(Sqlist L,int delta[],int t)
{
	//按增量delta[]对顺序表L进行排序 
	for(int k=0;k<t;++k)
	{
		shellInsert(L,delta[k])//一趟增量为delta的插入排序 
	}
}

关于增量序列delta[],尚未有人得出较好的结论。有人指出当delta[k] = 2^{t-k+1} - 1时,希尔排序的时间复杂度是O(n^{3/2}),其中t是排序趟数,k<=t

3.快速排序Quick Sort

(1)冒泡排序Bubble Sort
  • 冒泡排序的思想是什么?首先将第一个记录与第二个记录进行比较,如果逆序就swap,一直比较到最后一个记录的位置上;每一趟会比较出一个剩余最大的元素 放在后面,第i趟冒泡排序是从第1个到第n-i+1个依次比较。
(2)快速排序Quick Sort
  • 快速排序如何选择枢轴Pivot?由于如果记录序列最初是基本有序,然后快排序列的Pivot选择第一个元素的话,那么整个流程类似于冒泡排序,所以Pivot通常采用“三者取中”,即比较L.r[s].key和L.r[t].key和L.r[(s+t)/2],取三者中其关键字的中值作为枢轴。
  • 快速排序的思想?首先按照“三者取中”的原则选取一个Pivot,然后进行一趟排序,排序的结果是,将所有小于Pivot的元素移动到Pivot左侧,所有大于Pivot的元素移动到Pivot右侧,继续对Pivot左右两侧分别快排。And每一趟排序选取left和right,假设枢轴值是pivotkey,如果pivotkey大于high那么交换pivotkey和high,high--。
int Partition(Sqlist& L,int low,int high)
{
	//交换顺序表中子表r[low..high]
	L.r[0].key=L.r[low].key;
	int pivotkey=L.r[low].key;//将最小值赋值给枢轴
	while(low<high)
	{
		while(low<high&&L.r[high].key>=pivotkey)--high;
		L.r[low]=L.r[high];//将比枢轴小的记录移动到低端 
		while(low<high&&L.r[low].key<=pivotkey)++low;
		L.r[high]=L.r[low];//将比枢轴大的记录移动到高端 
	}
	L.r[low]=L.r[0];//将枢轴记录到位 
	return low;//返回枢轴位置 
}
void quickSort(Sqlist& L,int low,int high)
{
	if(low<high)
	{
		int pivotloc=Partition(L,low,high);//将L一分为二
		quickSort(L,low,pivotloc);//对低表进行递归排序
		quickSort(L,pivotloc+1,high);//对高表进行递归排序 
	}
}

快速排序被认为在所有同数量级O(nlogn)的排序中,其性能最好。

4.选择排序Selection Sort

(1)简单选择排序Simple Selection Sort
  • 简单选择排序的基本思想?在第i趟选择的过程中,从剩下n-i+1个元素中找到关键字最小的元素,与第i个元素进行交换,作为有序序列中的第i个元素。
  • 时间复杂度为O(n^{2})
(2)堆排序Heap Sort
  • 什么是堆?n个元素的序列{k1,k2,...,kn},当且仅当满足如下关系时,称之为堆:

k_i\leq k_{2i} And k_i\leq k_{2i+1}  或者  k_i \geq k_{2i} And k_i \geq k_{2i+1}其中i=1,2,3,..,n/2

  • 若将此序列对应的一维数组看成是一个完全二叉树,堆表明什么含义?完全二叉树所有非终端结点的值不大于(或不小于)其左右孩子结点的值。那么堆顶元素必为序列中n个元素的最小值或者最大值。
  • 使用堆排序应该解决哪两个问题?如何由一个无序序列建成一个堆;如何在输出堆顶元素之后,调整剩余元素称为一个新的堆。
  • 堆排序的代码?
void HeapAdjust(HeapType& H,int s,int m)
{
	elemtype rc=H.r[s];
	for(int j=2*s;j<=m;j*=2)//沿key较大的孩子结点向下筛选 
	{
		if(j<m&&H.r[j].key<H.r[j+1].key)
		++j;//j为key 
		if(rc.key>=H.r[j].key)break;
		H.r[s]=H.r[j];
		s=j; 
	}
	H.r[s]=rc;//插入 
}
void HeapSort(HeapType& H)
{
	//对顺序表H进行堆排序
	for(int i=H.length/2;i>0;i--)
	{
		HeapAdjust(H,i,H.length);	
	} 
	for(int i=H.length;i>1;--i)
	{
		swap(H.r[1],H.r[i]);//将堆顶记录,最后一个记录相互交换 
		HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆 
	}
}

5.归并排序Merging Sort

  • 什么是归并排序(什么是2-路归并排序)?假设有n个记录,将每一个记录看作n个有序的记录,两两归并,得到(n/2)向上取整 长度为2或者1的有序序列,再继续两两归并,如此重复得到n个有序的序列为止。
  • 代码是什么
void merge(int R[], int low, int mid, int high)
{
	int len = high - low + 1;
	int* temp = new int[len];
	int i = low, j = mid + 1;   
	int k = 0;     
	while (i <= mid && j <= high) {
		if (R[i] <= R[j]) {
			temp[k] = R[i];
			k++;
			i++;
		}
		else {
			temp[k] = R[j];
			k++;
			j++;
		}
	}
	while (i <= mid) {    
		temp[k] = R[i];
		k++;
		i++;
	}
	while (j <= high) {    
		temp[k] = R[j];
		k++;
		j++;
	}
	for (k = 0; k < len; k++)
		R[low + k] = temp[k];
}
void mergeSort(int R[], int low, int high){//主排序函数 
	if (low < high) {
		int mid = (low + high) / 2;
		mergeSort(R, low, mid);//左侧继续排序 
		mergeSort(R, mid+1, high);//右侧继续排序 
		merge(R, low, mid, high);//合并
	}
}

6.基数排序Radix Sorting

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1512144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu2004桌面系统英伟达显卡驱动安装方法

#如何查看显卡型号 lspci | grep -i vga#----output------ 01:00.0 VGA compatible controller: NVIDIA Corporation Device 1f06 (rev a1)根据 Device 后的 值 进入网站查询 pci-ids.ucw.cz/mods/PC/10de?actionhelp?helppci #根据显卡型号&#xff0c;下载对应系统的驱动…

Linux 硬件时间(RTC time)、系统时间(UTC时间、Universal time)、本地时间(Local time)、时区(Time zone)与夏令时(DST)解析

文章目录 理解时间&#xff1a;硬件时间、系统时间&#xff08;UTC时间&#xff09;、本地时间、时区与夏令时1. 硬件时间&#xff08;RTC time&#xff09;1.1 硬件时间简介1.2 如何使用硬件时间 2. 系统时间&#xff08;UTC时间&#xff09;&#xff08;Universal time&#…

TSINGSEE青犀煤矿矿井视频监控与汇聚融合管理视频监管平台建设方案

一、背景需求 随着我国经济的飞速发展&#xff0c;煤炭作为我国的主要能源之一&#xff0c;其开采和利用的重要性不言而喻。然而&#xff0c;煤矿事故频发&#xff0c;不仅造成了巨大的人员伤亡和财产损失&#xff0c;也对社会产生了深远的负面影响。视频监控系统作为实现煤矿智…

普发Pfeiffer OmniStar/ThermoStar GSD300/GSS300内部电路图装配安装3D图原理图电路板电路图详情内容看图片目录

普发Pfeiffer OmniStar/ThermoStar GSD300/GSS300内部电路图装配安装3D图原理图电路板电路图详情内容看图片目录

【考研】高等数学总结

文章目录 第一章 极限 函数 连续1.1 极限存在准则及两个重要极限1.1.1 夹逼定理1.1.1.1 数列夹逼定理1.1.1.2函数夹逼定理 1.1.2 两个重要极限1.1.2.1 极限公式11.1.2.1.1 证明1.1.2.1.2 数列的单调有界收敛准则1.1.2.1.2.1 二项式定理1.1.2.1.2.2 证明 1.1.2.2 极限公式21.1.2…

在Linux/Ubuntu/Debian中设置字体

下载字体。 下载你喜欢的字体&#xff0c;双击并安装。 之后更新字体缓存&#xff1a; fc-cache -f -v安装 GNOME 调整。 GNOME Tweaks 是一个工具&#xff0c;允许你自定义 GNOME 桌面环境的各个方面&#xff0c;包括字体。 如果你还没有安装 GNOME Tweaks&#xff1a; …

pytorch之诗词生成--2

先上代码: # -*- coding: utf-8 -*- # File : dataset.py # Author : AaronJny # Time : 2019/12/30 # Desc : 构建数据集 from collections import Counter import math import numpy as np import tensorflow as tf import settingsclass Tokenizer:""&…

MIT 6.S081---Lab: locks

Memory allocator (moderate) 修改kernel/kalloc.c&#xff0c;修改kmem声明并定义结构体数组&#xff1a; 修改kernel/kalloc.c中的kinit函数&#xff0c;对kmemList进行初始化&#xff1a; 修改kernel/kalloc.c中的kfree函数&#xff0c;获取当前的cpuid并将释放的内存添加到…

互联网架构与通信机制:从边缘到核心的深度解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

vscode使用npm命令无反应,而终端可以的解决办法

如若你遇到这种情况 使用命令 get-command npm 去下面这个路径把它删掉就可以了

MyBatis拦截器四种类型和自定义拦截器的使用流程

文章目录 MyBatis拦截器四种类型和自定义拦截器的使用流程一、MyBatis拦截器四种类型的详细解释&#xff1a;1. **ParameterHandler 拦截器**&#xff1a;2. **ResultSetHandler 拦截器**&#xff1a;3. **StatementHandler 拦截器**&#xff1a;4. **Interceptor Chain 拦截器…

24-Java策略模式 ( Strategy Pattern )

Java策略模式 摘要实现范例 策略模式的重心不是如何实现算法&#xff0c;而是如何组织、调用这些算法&#xff0c;从而让程序结构更加灵活&#xff0c;具有更好的维护性和扩展性。 策略模式属于行为型模式 摘要 1. 意图 针对一组算法&#xff0c;将每一个算法封装到具有共…

基于Springboot的代驾管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的代驾管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

从零搭建Vue项目

目录 环境准备 NodeJS安装 ​编辑 2. 选择安装目录 3. 验证NodeJS环境变量 4. 配置npm的全局安装路径 5. 切换npm的淘宝镜像 6. 安装Vue-cli Vue项目创建 1. 打开UI界面 2. 打开项目管理器 3. 创建项目 vue项目目录结构介绍 运行vue项目 Vue项目开发流程 Vue组…

工具篇--分布式定时任务springBoot 整合 elasticjob使用(3)

文章目录 前言一、Springboot 整合&#xff1a;1.1 引入jar&#xff1a;1.2 配置zookeeper 注册中心&#xff1a;1.3 定义job 业务类&#xff1a;1.4 job 注册到zookeeper&#xff1a;1.5 项目启动&#xff1a;1.5.1 zookeeper 注册中心实例&#xff1a;1.5.2 任务执行日志输出…

RANDOMIZE-IN-PLACE随机排列算法

给定一个长度为 n n n的数组&#xff0c;如何构造出一个随机排列呢&#xff1f;《算法导论》给了我们一个名为RANDOMIZE-IN-PLACE的随机算法&#xff0c;该算法在数组原址上进行排序&#xff0c;时间复杂度为 O ( n ) O(n) O(n)。下面本文将介绍RANDOMIZE-IN-PLACE的设计思想及…

代码随想录(day3)——链表

Leetcode.203 移除链表元素&#xff1a; 203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 对于本题&#xff0c;难点就在于对于头部结点的删除&#xff0c;以及给定链表为空时&#xff0c;如何进行遍历。因为需要遍历链表&#xff0c;假设访问链表下一个结点所对应…

开源绘图工具 PlantUML 入门教程(常用于画类图、用例图、时序图等)

文章目录 一、类图二、用例图三、时序图 一、类图 类的UML图示 startuml skinparam classAttributeIconSize 0 class Dummy {-field1 : String#field2 : int~method1() : Stringmethod2() : void } enduml定义能见度&#xff08;可访问性&#xff09; startumlclass Dummy {-f…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的行人跌倒检测系统(深度学习+UI界面+完整训练数据集)

摘要&#xff1a;开发行人跌倒检测系统在确保老年人安全方面扮演着至关重要的角色。本篇文章详尽地阐述了如何利用深度学习技术构建一个行人跌倒检测系统&#xff0c;并附上了完整的代码实现。该系统采用了先进的YOLOv8算法&#xff0c;并对YOLOv7、YOLOv6、YOLOv5等先前版本进…

ARM64汇编05 - MOV系列指令

MOV(wide immediate) MOV 可以将一个立即数移动到寄存器中。 .text:0000000000000834 80 46 82 D2 MOV X0, #0x1234 ; Keypatch modified this from:MOV X0, #0x1234 对应的汇编代码为&#xff1a;80 46 82 D2 看手册可知&#xf…