| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构---内部排序 -> 正文阅读 |
|
[数据结构与算法]数据结构---内部排序 |
目录 一、概述1.排序算法的稳定与不稳定1.1稳定:在排序前后,含相等关键字的记录的相对位置保持不变 1.2不稳定:相等关键字的记录的相对位置有可能改变 2.内部排序和外部排序2.1内部排序:在排序过程中,只使用计算机的内存存放待排序记录 2.2排序期间文件的全部记录不能同时存放在计算机内存中,要借助计算机的外存才能完成排序 2.3内外存之间的数据交换次数是影响外部排序速度的主要因素 3.排序方法的效率分析3.1时间复杂度:关键字的比较次数和记录移动次数 3.2空间复杂度:执行算法所需的附加储存空间 3.3稳定算法和不稳定算法 二、插入排序1.直接插入排序1.1直接插入排序从第二个记录开始(第一个记录为空、监视哨) 1.2直接插入排序第i趟后序列的前i+1个记录是有序的(每一趟都让后面的一个元素排序到前面构成新的有序序列) 1.3插入排序的思想: 1.3.1第一个记录是有序的 1.3.2从第二个记录开始,按关键字的大小将每个记录插入到已排好序的序列中 1.3.3一直进行到第n个记录 1.3.4整个排序过程需要进行比较、后移记录、插入适当位置。从第二个记录到第n个记录共需n-1趟 1.4直接插入排序原序列呈正序排列时,最省时间(相对的:原序列为反序时最费时间) 1.5直接插入排序是最稳定的排序方法 1.6时间复杂度:平均O(n^2);空间复杂度:O(1) 1.6.0时间复杂度:最好情况:比较O(n),移动O(1);最坏情况:比较O(n2),移动O(n2);平均O(n2) 2.折半插入2.1在直接插入排序进行第i个元素时,利用折半查找找到插入的位置 2.2折半插入排序是稳定的排序方法 2.3时间复杂度:O(n^2);空间复杂度:O(1) 2.3.0时间复杂度:最好情况:比较O(n),移动O(1);最坏情况:比较O(log2(n!)),移动O(n^2);平均O(n^2) 3.希尔排序3.1希尔排序的思想 3.1.1对待排记录序列先作“宏观”调整,再作“微观”调整 3.1.2“宏观”调整:“跳跃式”插入排序 3.2希尔排序概述 3.2.1将记录序列分成若干子序列,分别对每个子序列进行插入排序(将n个记录分为d个子序列) 3.2.2d为增量,它的值在排序过程中从大到小逐渐缩小,直至最后一趟排序减为1 3.3在增量为d时,希尔排序从d+1个排序开始 3.4希尔排序的最终增量为1(直接插入排序) 3.5希尔排序是不稳定得排序方法 3.6希尔排序得时间复杂度:平均O(n^1.3)到平均O(n^1.5) 3.7希尔排序得空间复杂度:O(1) 三、快速排序1.冒泡排序1.1冒泡排序一趟后最大元素沉底,最大元素位于它最终的位置上,总共需要n-1趟 1.2基本思想:从第一个记录开始,两两比较交换,一趟比较结果后,关键字最大的记录放到最后一个位置,最小的则上浮一个位置(n个记录比较n-1遍)(如果某趟后序列没有变化,就表示已经排好了) 1.3.1冒泡排序的结束条件为:最后一趟没有进行“交换记录” 1.3.2一般情况下,每经过一趟“冒泡”,“i减1”,但并不是每趟都这样 1.4冒泡排序是稳定的排序方法 1.5时间复杂度:最好情况:比较O(n), 移动O(1)最坏情况:比较O(n2), 移动O(n2)平均情况:O(n2) 1.6空间复杂性O(1) 2.快速排序2.1基本思想:(分治算法)找一个记录,以它的关键字作为“枢轴”,凡其关键字小于枢轴的记录均移动至该记录之前,反之,凡关键字大于枢轴的记录均移动至该记录之后,将序列划分:(小)枢轴(大) 2.2快排一趟后序列特征:存在一个元素,元素左边元素的关键字不大于它的关键字,它右边元素的关键字不小于它的关键字 2.3快速排序是不稳定的排序方法 2.4时间复杂度:最坏O(n^2);最好O(nlog2(n));平均O(nlog2(n)) 2.5快速排序是所有同量级O(nlogn)的排序方法中,平均性能最好的方法 2.6快速排序的改进:进行一次划分之前,将左端与有右端与中间的关键字相比,拿三者的中间值做枢轴 四、选择排序1.简单选择排序1.1基本思想: 1.1.1第一次从n个关键字中选择一个最小值,从而确定第一个元素 1.1.2第二次再从剩余元素中选择一个最小值,确定第二个元素 1.1.3共需n-1次选择 1.2每次简单选择排序后将有一个最小元素排到最前面 1.3关键字间的比较次数总计为n(n-1)/2 1.4移动记录的次数:最小值为0,最大值为3(n-1) 1.5简单选择排序方法是不稳定的 1.6时间复杂度:比较O(n^2),移动最好O(1),最差O(n) 1.7空间复杂度:O(1) 2.树形选择排序2.1又称锦标赛排序,是一种按照锦标赛的思想进行选择排序的方法 2.2首先对n个记录的关键字进行两两比较,然后递归比较前一步查找的[n/2](上取整)个关键字,如此重复直至选出最值关键字 2.3整个过程可以用n结点的完全二叉树表示 2.4排序算法时间复杂度:O(nlog(n)) 3.堆排序3.1堆排序属于选择排序:出发点是利用选择排序已经发生过的比较,记住比较的结果,减少重复比较的次数 3.2堆的定义:n个元素的关键字序列R[1].key,R[2].key,...,R[n].key,当且仅当满足下述关系时,称之为堆。 3.2.1R[i].key≤R[2*i].key且R[i].key≤R[2*i+1].key:小根堆 3.2.2R[i].key≥R[2*i].key且R[i].key≥R[2*i+1].key:大根堆(根结点的关键字最大) 3.3堆排序思想: 3.3.1由一个无序序列建成一个堆 3.3.2在输出堆顶元素后,调整剩余元素成为一个新的堆 3.4算法概要(大根堆): 3.4.1按关键字建立大根堆 3.4.2输出堆顶元素,采用堆顶元素与最后一个元素交换,最大元素得到正确位置 3.4.3对此时的前n-1个元素重新建堆 3.4.4循环执行2.4.2与2.4.3,知到排序完成 3.5建堆算法: 3.5.1先根据下标建立完全二叉树 3.5.2从最后一个非叶子结点开始建堆(n个结点,最后一个非叶子结点的下标为[n/2],将其与子结点比大小,不符合大小时,先横比,再纵比确定被取代结点的插入位置,逐渐向上一个非叶子结点转移比较[n/2]--->[(n-1)/2]--->......) 3.6堆排序是不稳定的排序 3.7时间复杂度为O(nlog(n));最坏情况:O(nlog2(n)) 3.8空间复杂度为O(1) 五、归并排序1.归并的定义1.1归并又叫合并,是指把两个或两个以上的有序序列合并成一个有序序列 1.2(根据比较循环的循环条件判断循环最多循环m+n-1次i<=m&&j<=n)将两个长度分别为n、m的递增有序序列归并为一个有序顺序表,元素最多的比较次数为m+n-1 2.(2路)归并排序思想2.1将顺序表分n份分别进行递归排序(循环分割直到最后每个表仅剩一个元素) 2.2将n个记录进行2路归并排序的时间复杂度为O(nlog2(n)) 2.3每一趟归并的时间复杂度为O(n),总共需进行[log2(n)]上取整 2.4归并排序是稳定的排序方法 2.5空间复杂度为O(n) 3.K-路归并3.1K路归并排序共需要logk(n)趟 3.2K路归并的时间复杂度为nlogk(n) 六、基数排序1.基数排序的起源1.1基数排序起源于箱(桶)排序,设置若干个箱子,依次扫描待排序的记录,A[1],A[2],...,A[n],把关键字为k的记录放在第k个箱子里,按序号将非空的箱子里的记录收集起来 1.2箱排序的缺点:如果关键字位数太大,这样做空间复杂度和时间复杂度都太大 2.链式基数排序2.1待排序记录以指针相链,构成一个链表 2.2“分配”时,按当前“关键字位”所取值,将记录分配到不同的“链队列”中,每个队列中记录的“关键字位”相同 2.3“收集”时,按当前关键字位取值从小到大将各队列首尾相链成一个链表 2.4对每个关键字位均重复2.2?和2.3?两步 2.5基数排序需要的分配与收集次数为最大关键字的位数 2.6排序概要:(先根据个位分开收集,位数逐渐上升,没有实质性的元素间的比较最终却可以排序完成) 2.6.1设待排记录A的关键字最大是figure位的正整数 2.6.2从最低位(个位)开始,扫描关键字的pass位,把等于0的插入Q[0],...,等于9的插入Q[9] 2.6.3将Q[0]~Q[9]中的数据依次收集到A[]中 2.6.4pass+1直到figure,重复执行1,2两步 3.算法分析3.1基数排序是稳定的 3.2空间复杂度与时间复杂度均为O(n) 七、内部排序方法的比较本笔记除了自己的一些理解外,参考《数据结构》,图片出自网络与课程ppt,如有侵权,请联系笔者删除。 最后希望大家一起学习,共同进步,如果有疑问或错误欢迎联系笔者。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 12:22:41- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |