CH8-排序

2023-11-04


1. 基本概念和排序方法概述

20220120181900

20220120182103

1.1 排序方法的分类

20220120182125

20220120182212

20220120182238

20220120182305

20220120182420

20220120182517

20220121104348

20220121104316

20220121104630

20220121104726

20220121104838

1.2 存储结构 (顺序表)

#define MAXSIZE20		//设记录不超过20个
typedef int KeyType ;	//设关键字为整型量(int型)

Typedef struct {		//定义每个记录(数据元素)的结构
    KeyType key ; 		//关键字
    InfoType otherinfo; //其它数据项
}RedType ; 				//Record Type

Typedef struct {			//定义顺序表的结构
	RedType r[ MAXSIZE+1 ];//存储顺序表的向量
							//r[0]一般作哨兵或缓冲区
	int length ;/顺序表的长度
}SqList ;

2. 插入排序

20220121105500

20220121105534

20220121105615

20220121105652

2.1 插入排序的种类

20220121105712

直接插入

20220121105916

20220121110101

void InsertSort( SqList &L ) {
    int i, j;
    for (i=2; i<=L.length; ++i) {
        if (L.r[i].key < L.r[i-1].key){ //若"<",需将L.r[i]插入有序子表
            L.r[O]=L.r[i];					//复制为哨兵
            for (j=i-1; L.r[O].key<L.r[j].key; --j ){
            	L.r[j+1]=L.r[j];				//记录后移
            }
            	L.r[j+1]=L.r[0];				//插入到正确位置
        }
    }
}

20220121110748

20220121110933

20220121111014

20220121111104

折半插入

20220121111451

void BInsertSort ( SqList &L ) {
    for ( i = 2; i<= L.length ; ++i ){//依次插入第2~第n个元素
        L.r[0] = L.r[i]; 			  //当前插入元素存到“哨兵”位置
        low = 1 ; high = i-1;		  //采用二分查找法查找插入位置
        while ( low <= high ) {
            mid = ( low + high ) / 2 ;
            if ( L.r[O].key < L.r[mid]. key )  high = mid -1
            else low = mid + 1;
        }//循环结束,high+1则为插入位置
        for ( j=i-1; j>=high+1; --j){ 
            L.r[j+1] = L.r[j];//移动元素
            L.r[high+1] = L.r[0];//插入到正确位置
        }
    }
}// BInsertSort

20220121112348

20220121112450

希尔排序

20220121112630

20220121112717

20220121112835

20220121112932

20220121113021

void ShellSort (Sqlist &L, int dlta[],int t){
//按增量序列dlta[0..t-1]对顺序表L作希尔排序。
    for(k=0; k<t; ++k)
		ShellInsert(L,dlta[k]);//一趟增量为dlta[k]的插入排序
}//ShellSort

void ShellInsert(SqList &L,int dk){//对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子
    for(i=dk+1; i<=L.length; ++i)
        if(r[i].key < r[i-dk].key) {
            r[0]=r[i];
            for(j=i-dk; j>0 &&(r[0].key<r[j].key); j=j-dk)
                r[j+dk]=r[j];
            r[j+dk]=r[0];
        }
}

20220121114442

20220121114633

20220121114706

3. 交换排序

20220121114855

3.1 冒泡排序

20220121114939

20220121115034

20220121115110

20220121115206

void bubble_sort(SqList &L){//冒泡排序算法
    int m,i,j; RedType x;	//交换时临时存储
    for(m=1; m<=n-1; m++){	//总共需m趟
        for(j=1; j<=n-m; j++)
            if(L.r[j].key>L.r[j+1].key){//发生逆序
                x=L.r[j]; 
                L.r[j]=L.r[j+1];
                L.r[j+1]=x;//交换
            }//endif
    }//for 
}

20220121115719

void bubble_sort(SqList &L){//改进的冒泡排序算法
    int m,ij,flag=1; RedType x; //flag作为是否有交换的标记
    for(m=1; m<=n-1&&flag==1; m++){
        flag=0;
        for(j=1; j<=m; j++)
            if(L.r[j].key>L.r[j+1].key){//发生逆序
            	flag=1;				//发生交换,flag置为1,若本趟没发生交换,flag保持为0
                x=L.r[j];
                L.r[j]=L.r[j+1];
                L.r[j+1]=x;//交换
            }//endif
    }//for
}

20220121120332

20220121120850

3.2 快速排序

20220121120951

20220121121055

20220121121145

20220121121244

20220121121320

void main ( ) {
    QSort ( L,1,L.length ); 
}

void QSort (SqList &L, int low, int high){//对顺序表L快速排序
    if (low < high){ 			//长度大于1
		pivotloc = Partition(L, low, high);
        //将L.r[low..high]一分为二,pivotloc为枢轴元素排好序的位置
        QSort(L, low, pivotloc-1);//对低子表递归排序
		QSort(L, pivotloc+1, high);//对高子表递归排序
    }//endif 
} // QSort

int Partition ( SqList &L,int low, int high ) {
    L.r[0] = L.r[low];
    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[O];
    return low;
}

20220121125330

20220121125348

20220121125512

20220121125559

20220121125705

4. 选择排序

20220121130002

4.1 直接排序

20220121130039

20220121130103

void SelectSort(SqList &K){
    for (i=1; i<L.length; ++i){
        k=i;
        for(j=i+1; j<=L.length; j++)
            if( L.r[j].key<L.r[k].key) k=j;//记录最小值位置
        if(k!=i) L.r[i]<-->L.r[k];			//交换
    }
}

20220121130712

4.2 堆排序

20220121133710

20220121133832

20220121134114

20220121134208

堆的调整

20220121134239

20220121134704

void HeapAdjust (elem R[ ], int s, int m) {
/*已知R[s..m]中记录的关键字除R[s]之外均满足堆的定义,本函数调整R[s]的关键字,使R[s..m]成为一个大根堆*/
    rc = R[s];
    for ( j=2*s; j<=m; j *= 2){		//沿key较大的孩子结点向下筛选
        if (j<m && R[j]<R[j+1])	
            ++j; //j为key较大的记录的下标
        if ( rc >= R[j] ) 
            break;
    	R[s] = R[j];	
        s = j;		//rc应插入在位置s上
    }//for
    R[s] = rc;//插入
}// HeapAdjust

20220121135027

堆的建立

20220121135312

20220121135411

20220121143509

20220121143607

20220121143837

void HeapSort ( elem R[ ] ){//对R[1]到R[n]进行堆排序
    int i;
    for ( i = n/2 ; i>= 1; i -- )
    	HeapAdjust ( R ,i , n );//建初始堆
    for ( i = n; i >1 ; i - - ) {//进行n - 1趟排序
    	Swap ( R[1], R[i] );//根与最后一个元素交换
        HeapAdjust ( R,1,i -1);//对R[1]到R[i-1]重新建堆}
}//HeapSort

20220121144319

20220121144935

5. 归并排序

20220121145321

20220121145514

20220121145713

20220121145832

20220121145853

6. 基数排序

20220121150119

20220121150409

20220121150510

20220121150624

20220121150746

20220121150825

20220121150953

7. 外部排序

20220121151034

20220121155324

20220121155410

20220121155638

20220121155737

mg-1mJQMHaH-1642926930837)]

[外链图片转存中…(img-6sMyUKaa-1642926930838)]

[外链图片转存中…(img-YzZfpCPR-1642926930838)]

[外链图片转存中…(img-daIMOOOn-1642926930838)]

7. 外部排序

[外链图片转存中…(img-xFufCyXy-1642926930839)]

[外链图片转存中…(img-zQEhGCaz-1642926930839)]

[外链图片转存中…(img-Hf6aaGqW-1642926930840)]

[外链图片转存中…(img-u4bbceay-1642926930841)]

[外链图片转存中…(img-c4E2GNAw-1642926930841)]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CH8-排序 的相关文章

  • Vector的自动排序Sort

    建立了一个结构体 然后用容器进行存放 想对其进行排序 vector支持sort函数 但是需要自己指定排序函数 方法如下 1 需要包含头文件 include
  • react native 实现拖拽排序

    先上效果图 意思意思 其实原理很简单 没有想的那么难 大家在改造的时候 请注意 this offset 的值 因为它关系到查找目标box的index 原理 手势释放时 所在的坐标值来推算出目标box的Index 本文代码可读性还需要改造 代
  • 数据结构与算法之快速排序

    package com yg sort author GeQiLin date 2020 2 26 21 00 import java util Arrays public class QuickSort private static in
  • C++ lambda自定义map,set,vector,list 排序规则

    Map和Set本质红黑二叉树 插入数据时可以自定义比较算法 list和vector链表插入时无需比较 所以一般全部插入完成后调用sort 核心代码 typedef struct MyStudent std string name int g
  • 15_插入排序算法(附java代码)

    15 插入排序算法 一 基本介绍 插入式排序属于内部排序法 是对于欲排序的元素以插入的方式找寻该元素的适当位置 以达到排序的目的 二 插入排序算法 2 1 算法思想 插入排序 Insertion Sorting 的基本思想是 把n个待排序的
  • 快速排序一趟后结果

    题目 原序列 20 18 22 16 30 19 以20为基准 写出一趟排序后结果 话不多说 直接上图 方法 1 找出比基准小的部分和大的部分 分成两部分 并确定基准的位置 比20小 18 16 19 比20大 22 30 所以20应是第四
  • 八大排序总结---- 数据结构 (图解法) 面试必会! ! !

    八大排序总结 目录 一 插入排序 InsertSort 二 希尔排序 ShellSort 三 选择排序 SelectSort 四 堆排序 HeapSort 五 冒泡排序 BubbleSort 六 快速排序 QuickSort 1 hoare
  • 快速排序c++实现

    思想 用过一趟排序将要排序的数据分割成独立的两部分 其中一部分的所有数据都比另外一部分的所有数据要小 然后再对这两部分重复此步骤 直到整个数组变成有序序列 对一个数组实现一趟快速排序的过程 1 定义两个变量 一个指向数组最前 一个指向最后
  • 排序(六):归并排序

    排序算法系列文章 排序 一 冒泡排序 排序 二 选择排序 排序 三 堆排序 排序 四 插入排序 排序 五 二分搜索 排序 六 归并排序 排序 七 快速排序 排序 八 希尔排序 目录 排序算法系列文章 归并排序 Merge Sort 基本思想
  • ​LeetCode刷题实战33:搜索旋转排序数组

    来源 https www cnblogs com techflow p 12441002 html 算法的重要性 我就不多说了吧 想去大厂 就必须要经过基础知识和业务逻辑面试 算法面试 所以 为了提高大家的算法能力 这个公众号后续每天带大家
  • 分支算法应用2--快速排序

    快速排序 快速排序就是将一个需要排序的数组A a0 a n 1 顺序排列输出 首先从数组中随便找到一个元素x 然后将小于这个元素x的所有元素放到这个元素左边 将大于这个元素x的所有元素放到这个元素的右边 最后运用递归再对x左边和右边的元素进
  • 算法 - 堆排序(C#)

    csharp view plain copy print
  • 排序算法(2)

    本文介绍插入排序和希尔排序 插入排序是较为常见的排序算法 希尔排序也是基础的排序算法 废话不多说 具体来看一下两种算法 插入排序 插入排序的基本思想是拿到下一个插入元素 在已经有序的待排数组部分找到自己的位置 然后进行数据的移动 完成该元素
  • 睿智的seq2seq模型1——利用seq2seq模型对数字进行排列

    睿智的seq2seq模型1 利用seq2seq模型对数字进行排列 学习前言 seq2seq简要介绍 利用seq2seq实现数组排序 实现方式 一 对输入格式输出格式进行定义 二 建立神经网络 1 神经网络的输入 2 语义编码c的处理 3 输
  • 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

    四种排序 选择 插入 冒泡 快速排序原理及其对应的时间空间复杂度 首先 在了解四种排序之前 让我们来了解一下什么是时间复杂度和空间复杂度 时间复杂度 算法的时间复杂度是一个函数 它定性描述该算法的运行时间 记做T n 直白的来说 就是指运行
  • 【100%通过率 】【华为OD机试c++\python】组合出合法最小数【2023 Q1 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 给一个数组 数组里面都是代表非负整数的字符串 将数组里所有的数值排列组合拼接起来组成一个数字 输出拼接成的最小的数字 输入描述 一个数组 数组不
  • Python针对字符串进行去重和排序,for循环、列式推导法、set

    Python针对字符串进行去重和排序 第一种方法for循环 第二种方法就是列式推导法 第三种方法是用set 第一种方法for循环 首先针对与字符串的去重可以用到for循环去重 然后再把for循环之后的字符串变成数组 最后再用sort进行排序
  • 快速排序(三种算法实现和非递归实现)

    快速排序 Quick Sort 是对冒泡排序的一种改进 基本思想是选取一个记录作为枢轴 经过一趟排序 将整段序列分为两个部分 其中一部分的值都小于枢轴 另一部分都大于枢轴 然后继续对这两部分继续进行排序 从而使整个序列达到有序 递归实现 v
  • 插入排序超详解释,一看就懂

    目录 一 插入排序的相关概念 1 基本思想 2 基本操作 有序插入 二 插入排序的种类 三 直接插入排序 1 直接插入排序的过程 顺序查找法查找插入位置 2 使用 哨兵 直接插入排序 四 直接插入排序算法描述 五 折半插入排序 1 查找插入
  • 数据结构算法-快速排序

    核心思路 快速排序算法核心思路 选择一个 基准 元素 将数组分为两个子数组 一个包含比基准小的元素 另一个包含比基准大的元素 然后对这两个子数组进行递归排序 基准数 初始化两个索引 i 和 j 分别子数组的开头和结尾 初始化基准元素 bas

随机推荐

  • 十、Update 存储过程

    文章目录 修改数据的要求 存储过程中的数据库异常 我们需要数据库异常 MariaDB 发起异常 SIGNAL和RESIGNAL mariaDB 捕获异常 捕获指定异常 捕获自定义异常 获取异常消息 update 锁及其测试 Update 锁
  • 通过Dockerfile启动容器遇到的两个不常见错误

    1 报错 ImportError cannot import name cached property from werkzeug 安装更高级的版本 pip install Werkzeug 0 16 0 2 已安装pip 执行python
  • Python入门--关键字

    关键字是Python编程语言中具有特殊含义的保留单词 不能用作变量名 函数名 类名或其他标识符 以下是Python 3 9 0版本中的关键字列表 False None True and as assert async await break
  • 将 varchar 转换为数据类型 numeric 时出现算术溢出错误

    SQL Server 2005 中 如果使用5位以上的字符串转换为numeric时就会出现 将 varchar 转换为数据类型 numeric 时出现算术溢出错误 这样的错误 如果使用5位以下 含5位 的就不会出错
  • Python笔记18-继承&函数重写

    一 继承 重点掌握 1 概念 如果两个或者两个以上的类具有相同的属性和方法 我们可以抽取一个类出来 在抽取出来的类中声明各个类公共的部分 被抽取出来的类 父类 father class 超类 super class 基类 base clas
  • Java List转换成String数组

    实现代码 List
  • Android阿里云推送离线通知集成踩坑之路

    最近因为公司后台服务器买的是阿里云的服务 所以把友盟的推送换成了阿里云推送 首先不得不说 文档写得很差 兼容性和适配做得也不是很好 加了技术支持群 但是里面的同学问一个问题半天才有回复 好了 不扯谈 直接上代码 1 添加依赖 由于公司项目是
  • C++ 计算数组长度

    实现程序如下 include
  • Sublime Text3 BracketHighlighter

    BracketHighlighter 括号匹配插件 修改Preferences gt Package Settings gt BracketHighlighter gt Bracket Settings 修改settings User文件
  • 深入理解Gradle、Maven等JAVA项目的构建工具

    目录 简单概括构建工具的作用 构建工具的具体作用 Gradle和Maven的比较 简单概括构建工具的作用 构建工具用于自动化构建 编译 测试 和打包软件项目极大地简化软件开发的过程 提高开发效率和可靠性 让开发者更加专注于业务逻辑和代码实现
  • 云计算基本概念

    云计算的定义 1 云计算是同时描述一个系统平台或者一类应用程序的术语 云计算平台按需进行动态部署 Provision 部署 Configuration 重新部署 Reconfigure 以及取消服务 Deprovision 等 在云计算平台
  • Reducer buckets have been rebuilt in this iteration.

    在跑torch多GPU报错 Reducer buckets have been rebuilt in this iteration 原因是torch版本问题 torch1 7以上的distributed py发生更改导致报错 这玩意是dis
  • pymysql 重连

    self conn ping reconnect True
  • js给json格式的数组中每一项添加

    for let i 0 i lt this theme length i for let j 0 j lt dayarr length j this theme i day dayarr j
  • DevExpress GridControl复合表头(多行表头)设置

    首先 DevExpress XtraGrid的GridControl复合表头或多行表头的示例 界面如下图所示 实现步骤 1 将DevExpress的GridControl转换为BandedGridView 具体如下图 2 设置显示列及绑定的
  • SpringBoot 整合 kafka 遇到的版本不对应问题

    SpringBoot 整合 kafka 需要在SpringBoot项目里增加kafka的jar 而最为关键的一点是版本要对应好 如果你的SpringBoot是2 0 3版本
  • 国际版阿里云/腾讯云:弹性高性能计算E-HPC入门概述

    入门概述 本文介绍E HPC的运用流程 帮助您快速上手运用弹性高性能核算 下文以创立集群 在集群中安装GROMACS软件并运转水分子算例进行高性能核算为例 介绍弹性高性能核算的运用流程 帮助您快速上手运用弹性高性能核算 运用流程如下图所示
  • Jmeter —— 录制脚本

    1 第一步 添加http代理服务器 在测试计划 添加 非测试元件 http代理服务器 2 第二步 添加线程组 这个线程组是用来放录制的脚本 不添加也可以 就直接放在代理服务器下 测试计划 添加 线程 线程组 顺便讲一下线程组执行顺序 set
  • Idea快捷键(快速开发)

    Idea快捷键 快捷键 功能 Alt Enter 快速修复选择 Alt Insert 生成代码 如set get 构造方法等 Alt 切换到左侧视图 Alt 切换到右侧视图 Shift Shift 搜索文件 Ctrl D 复制当前一行 插入
  • CH8-排序

    文章目录 1 基本概念和排序方法概述 1 1 排序方法的分类 1 2 存储结构 顺序表 2 插入排序 2 1 插入排序的种类 直接插入 折半插入 希尔排序 3 交换排序 3 1 冒泡排序 3 2 快速排序 4 选择排序 4 1 直接排序 4