数据结构——排序【仅用于考试】

1、简介

排序,是重新排列表中的元素,使表中的元素满足按关键字有序的过程

稳定性:选取两个元素Ri<Rj,经过排序算法之后,仍为Ri<Rj

不稳定的排序:【简单选择排序,快速排序,堆排序、希尔排序】

内部排序:指在排序期间元素都在内存中的排序,

外部排序:指在排序期间元素在内外存之间移动的排序,如:多路归并排序

希尔排序:平均o(n^1.3),最坏o(n^2),最好o(n)

2、各类排序算法

2.1 插入排序

基本思想:每次将一个待排序的记录按其关键字大小插入前面已经排好序的子序列,直到所有记录插入完成。

过程:

例子(49,38,65,97,76,13,27,49(1))【49和49(1)的值一样,为了区分标记】

选定[49]为排好序的子序列,按照上述算法进行排序:

i=1(初始值):[49], 38 , 65 , 97 , 76 , 13 , 27 , 49(1)

i=2:                [38 ,49] , 65 , 97 , 76 , 13 , 27 , 49(1)

i=3:                [38 ,49, 65] ,  97 , 76 , 13 , 27 , 49(1)

i=4:                [38 , 49, 65 , 97] , 76 , 13 , 27 , 49(1)

i=5:                [38 ,49 , 65 , 76 , 97] , 13 , 27 , 49(1)

i=6:                [ 13 ,38 ,49 , 65 , 76 , 97] , 27 , 49(1)

i=7:                [ 13 ,27 , 38 ,49 , 65 , 76 , 97],  49(1)

i=8:                [ 13 ,27 , 38 ,49 , 49(1) 65 , 76 , 97]

2.2 折半插入排序

折半插入算法仅减少了比较元素的次数,该比较次数与待排序表的初始状态无关,仅取决于表中的元素个数,而元素的移动次数未变,与待排序表的初始状态有关。

2.3 希尔排序

基本思想:先将待排序分割成若干子表,间隔为d,对各个子表进行直接插入排序,然后减少间隔d,直到d<1,然后再对全体记录记录进行一次直接插入排序。

过程:( 49,38,65,97,76,13,27,40,55,04),d=5,则子序列为

(49,13)[排序]--->(49,13),交换

(38,27)[排序]--->(38,27)不交换

(65,40)[排序]--->(65,40),交换

(97,55)[排序]--->(97,55),交换

(76,04)[排序]--->(76,04),交换

第一趟结果为:13,27,40, 55,04, 49,38,65,97,76

第二趟d=3:

(13,55,38,76)->(13,3,8,55,76)

(27,04,65)->(04,27,65)

(40,49,97)->(40,49,97)

结果为:13,04,40,38,27,49,55,65,97,76

第三趟(d=1):04,13,27,38,40,49,55,65,76,97[直接插入排序]

应用场景:线性表为顺序存储的情况

2.4 冒泡排序

冒泡排序的基本思想是从前往后(从后往前)两两比较相邻元素的值,若为逆序,则交换,直到序列比较完成,这个叫第一趟冒泡排序,将最小的元素交换到待排序列的第一个位置。

过程:

2.5 快速排序

快速排序【递归工作栈】是基于分治法的,从当前参加排序的元素中任选一个元素(通常称之为分界元素)与当前参加排序的那些元素进行比较,凡是小于分界元素的元素都移到分界元素的前面,凡是大于分界元的元素都移到分界元素的后面,分界元素将当前参加排序的元素分成前后两部分,而分界元素处在排序的最终位置。然后,分别对这两部分中大小大于1的部分重复上述过程,直到排序结束。

采用递归方式进行快排,递归次数与每次划分后得到的分区处理顺序无关,递归次数与初始数据的排列次序有关,对分区的长短处理顺序,影响的是递归时对栈的使用内存

过程:(49,38,65,97,76,13,27)选取分界元素49,并定义low=0,high=n-1(6)指向序列头尾

第一趟[i=2,j=6]:49,38,65,97,76,13,27--->27,38,49,97,76,13,65(low找到65,high找到13,并进行交换)

[i=3,j=5]   27,38,49,97,76,13,65---> 27,38,13,49,76,97,65 [第一趟结束,分割为两个序列,]

第二趟(左序列):{27,38,13},49,{65,97,76}--->13,27,38(选分界元素27,low找到38,high找到13,并进行交换)

(右序列):{76,97,65}--->{65,76,97}(选分界元素76,low找到97,high找到65,并进行交换)

快排的运行时间和划分是否对称有关

2.6 简单选择排序

简单选择排序是假设排序表为L,长度为n,第i趟排序就是从L[i...n]中选择关键字最小的元素与L[i]交换,每一趟排序可以确定一个元素的最终位置。

过程:(49,38,65,97,76,13,27)以49为基准

第一趟:13,38,65,97,76,49,27 ,以38为基准

第二趟:13,27,65,97,76,49,38 ,以65为基准

第三趟:13,27,38,97,76,49,65 ,以97为基准

第四趟:13,27,38,49,76,97,65 ,以76为基准

第五趟:13,27,65,97,65,97,76 ,以97为基准

第六趟:13,27,65,97,65,76,97

简单选择排序算法的元素移动次数较少,不会超过3(n-1),元素的比较次数与初始状态无关。

2.7 堆排序

n个关键字序列,且满足条件①为大根堆,满足条件②是小根堆,堆是一棵完全二叉树。

堆排序是将n个待排序元素建成初始化堆,由于堆本身的特点,堆顶元素为最值,输出堆顶元素之后,将堆底元素送入堆顶,再进行堆调整。

基本思想:

1、按照层次遍历将待排序元素初始化为一棵完全二叉树;

2、找到最后一个非叶子节点,进行非叶子节点和该结点的叶子结点进行比较,如果叶子结点大于非叶子节点,需要交换,没有就不交换

3、继续遍历其他非叶子节点,如果交换之后的子树存在不满足于堆的性质,也需要进行交换,直到遍历所有非叶子结点,找到最大值,将最大值取出,并将二叉树的最后一个叶子结点填充到堆顶,并继续进行交换过程,直到只剩一个结点,该序列就是排序之后的结果。

过程(大根堆):

例:(49,38,65,97,76,13,27)

 列表输出[97]

 列表输出[97,76]

  列表输出[97,76,65,49]

 最终列表输出[97,76,65,49,38,27,13]

2.8归并排序

归并排序是将两个或两个以上的有序表组合成一个新的有序表,以二路归并排序为例,假定待排序数组的长度为n,可将视为有n个有序子表,两两归并,得到\left \lceil n/2 \right \rceil个长度为2或1的有序表,在两两归并,直到合并后为一个长度为n的有序表为止。

例:(49,38,65,97,76,13,27)

初始值:[49] ,[38] ,[65] ,[97] ,[76] ,[13] ,[27]

第一趟:[49,38] ,[65,97] ,[76 ,13] ,[27]  --->[38,49] ,[65,97] ,[13 ,76] ,[27]

第二趟:[38,49,65,97] ,[13 ,76,27]  --->[38,49,65,97] ,[13,27,76]

第三趟:[38,49,65,97] ,[13,27,76]  --->[13,27,38,49,65,76,97]

空间:o(n)

时间:每趟归并的时间复杂度o(n),归并次数o(log2n),总时间复杂度o(nlog2n)

3、例题

3.1 选择题

  • 就排序算法平均所用的辅助空间而言,堆排序、快速排序、归并排序的大小关系是堆排序o(1)<快速排序o(log2n)<归并排序o(n)
  • 当内存不足以一次性存入全部数据时,应使用外部排序(多路归并排序)
  • 下标从1开始,在含有n个关键字的小根堆(堆顶元素最小)中,关键字最大的记录有可能存储在
    [n/2]+2位置上(分析堆是完全二叉树,假设有h层,前h-1层的节点数是2^(h-1)-1,那2^(h-1)<=n)
  • 在下列排序算法中,在待排序的数据表已经为有序时,花费时间反而最多的是快速排序
  • 元素的移动次数与关键字的初始排列次序无关的是基数排序; 元素的比较次数与关键字的初始排列无关的是选择。

3.2 简单题

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

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

相关文章

[UWP]做个调皮的BusyIndicator

1. 前言 最近突然想要个BusyIndicator。做过WPF开发的程序员对BusyIndicator应该不陌生&#xff0c;Extended WPF Toolkit 提供了BusyIndicator的开源实现&#xff0c;Silverlight Toolkit也有一个&#xff0c;这次想要把这个控件移植到UWP中。 2. 先说点正经的 2.1 BusyIndica…

STM32——I2C

STM32——I2C 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C协议 I 2 C &#xff08;Inter-Integrated Circuit&#xff09;协议是由 Philips 公司开发的&#xff0c;由于它具备引脚少、硬件实现简单、可扩展性强、不需要如 USART、CAN 的外部…

C语言发展简史

1、起源C 语言最早的原型是 ALGOL 60 1963 年&#xff0c;剑桥大学将其发展成为 CPL(Combined Programing Language)。1967 年&#xff0c;剑桥大学的 Matin Richards 对 CPL 语言进行了简化&#xff0c;产生了 BCPL 语言。1970 年&#xff0c;美国贝尔实验室(Bell Labs)的 Ken…

STM32——EEPROM

STM32——EEPROM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、I2C接口读写EEPROM&#xff08;AT24C02&#xff09; ——主模式&#xff0c;分别用作主发送器和主接收器。通过查询事件的方式来确保正常通信。 1、I 2C接口初始化 与其他对GPIO 复用…

Linus Torvalds谈ECC内存的重要性 痛斥英特尔正在扼杀它

新年假期&#xff0c;Linus Torvalds在邮件列表中发表的一篇火热的帖子引发技术社区关注&#xff0c;人们借此讨论ECC内存的重要性&#xff0c;Torvalds在文章中抨击了英特尔在这方面的”坏政策”&#xff0c;因为特定的市场细分使ECC内存不那么普及。Linus认为&#xff0c;纠错…

加密和解密算法的兩個實現

最近一段時間,集團加強了資安方面的管理,所有敏感的配置字節都必須經過加密處理,把最近用到的幾個加解密類整理了一下,以做備忘. 其實這兩個類實現的方法差不多,只是有些細微區別: 對稱加密演算法類 SymmetricMethodHelperusing System;using System.IO;using System.Security.…

47.leetcode36_valid_suduko

1.题目分析 Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be partially filled, where empty cells are filled with the character .. A partially filled sudoku which is valid. Note: A valid Sudoku board (partia…

STM32——SPI接口

STM32——SPI接口 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 一、SPI协议【SerialPeripheral Interface】 串行外围设备接口&#xff0c;是一种高速全双工的通信总线。在ADC/LCD等与MCU间通信。 1、SPI信号线 SPI 包含 4 条总线&#xff0c;SPI 总…

这两种printf()函数重定向方法,太实用了

作者&#xff1a;echobright原文链接&#xff1a;https://blog.csdn.net/qq_29344757/article/details/75363639在前面学习了STM32的串口编程&#xff0c;通过USART1向计算机的串口调试助手打印数据&#xff0c;或者接收计算机串口调试助手的数据&#xff0c;接下来我们可以实现…

浅析Linux 64位系统虚拟地址和物理地址的映射及验证方法

前言有好久没更新了&#xff0c;这段时间发生了挺多大喜事哈。但是也还是有挺久没更新了&#xff0c;不得不意识到自己是个小菜鸡&#xff0c;就算是小菜鸡也要做一只快乐小菜鸡。就算更新慢但是我依然会持续更新&#xff0c;因为更文使我快乐。虚拟内存先简单介绍一下操作系统…

C语言指针:从底层原理到花式技巧,用图文和代码帮你讲解透彻

一、前言二、变量与指针的本质三、指针的几个相关概念四、指向不同数据类型的指针五、总结一、前言如果问C语言中最重要、威力最大的概念是什么&#xff0c;答案必将是指针&#xff01;威力大&#xff0c;意味着使用方便、高效&#xff0c;同时也意味着语法复杂、容易出错。指针…

ARM

ARM 宗旨&#xff1a;技术的学习是有限的&#xff0c;分享的精神是无限的。 1 、ARM处理器的特点 ARM 处理器具有耗电少&#xff0c;功能强大&#xff0c;16 位/32 位双指令集等众多优点。主要有以下六个主要特点&#xff1a; ① 体积小、低功耗&#xff0c;低成本和高性能&am…

解决一个I2C读写问题

之前写关于I2C相关的文章排查一个触摸屏驱动问题MTK 平台TP调试遇坑1、问题今天遇到一个问题&#xff0c;我们有一个芯片&#xff0c;I2C读写失败&#xff0c;导致录音有问题&#xff0c;而且是偶现的。log提示看到是返回 -6<3>[ 730.336308] (3)[2085:tinycap]es7243_…

用多媒体库 Bass.dll 播放 mp3 [9] - 绘制波形图

本例效果图:代码文件:unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ExtCtrls, ComCtrls;typeTForm1 class(TForm)OpenDialog1: TOpenDialog;PaintBox1: TPaintBox;Button1: TButton;Button2: TBut…

我是如何使用wireshark软件的

长按二维码识别关注技术共享|资料共享|沟通交流01简介这篇文章介绍一个好用的抓包工具Wireshark&#xff0c; 用来获取网络数据封包&#xff0c;包括HTTP、TCP、UDP等网络协议包。开始界面wireshark是捕获机器上的某一块网卡的网络包&#xff0c;当你的机器上有多块网卡的时候&…

BZOJ4681 [jsoi2010]旅行

时间限制&#xff1a; 3S空间限制&#xff1a; 256M具体思路:DPf[i][j][k]表示1-i,前L条路上用了 j条,L后的路上换了k条的最小代价枚举一下L就有了一个复杂度O(nlognk^3)的做法AC代码#include<bits/stdc.h> using namespace std; #define INF 100000000 #define P pair&l…

IIC踩过的坑

读取IT8563WE时&#xff0c;读取第一次正确&#xff0c;第二次错误&#xff0c;第三次正确&#xff0c;第四次错误。。。。。。看到读取成功之后&#xff0c;SDA信号没有被正确拉高&#xff0c;电平大概只有一半。再次读取&#xff0c;主机设置读模式时&#xff0c;从机会发送N…

1万字30张图说清TCP协议

本篇文章较长&#xff0c;大家先看下目录1、简介2、TCP协议头3、TCP 数据包的编号&#xff08;SEQ&#xff09;4、三次握手建立连接5、四次挥手断开连接6、TCP可靠性的保证7、滑动窗口技术9、窗口滑动的数据重发9、TCP 流控制10、网线“断”了怎么办01简介TCP(Transmission Con…

Spring源码解析(二)BeanDefinition的Resource定位

IOC容器的初始化过程主要包括BeanDefinition的Resource定位、载入和注册。在实际项目中我们基本上操作的都是ApplicationContex的实现&#xff0c;我们比较熟悉的ClassPathXmlApplicationContext、FileSystemXmlApplicationContext、XmlWebapplicationContext等。ApplicationCo…

单片机(MCU)如何才能不死机之对齐访问(Aligned Access)

从一个结构体说起。如下&#xff0c;在 STM32F0 的程序中&#xff0c;我们定义了一个结构体My_Struct &#xff0c;那么这个结构体占用多少内存呢&#xff1f;struct Struct_Def { uint8_t Var_B; uint16_t Var_W0; uint16_t Var_W1; uint32_t Var_DW; }; struct Struct_Def My…