欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

李春葆编写的《数据结构教程》核心框架概览

最编程 2024-07-30 22:29:13
...
  • 排序的基本概念
    • 稳定性
  • 插入排序:每次将无序区第一个插入有序区
    • 直接插入算法
      • 接口:无序数组A,数组长度n
      • 临时变量
        • i遍历整个序列代表代插入关键字,j遍历有序区,temp保存带插入无序关键字
      • 运算过程
        • 两层循环,一层循环整个序列,二层循环遍历有序区插入
        • 一层循环内,先判断a[i]与前一个是否无序,若无序那就排序,temp保存关键字,j=i-1,进入二层循环,从后向前找到合适位置,并后移关键字一位,然后temp放入
    • 折半插入算法:只是第二层循环用的是折半查找
        • 接口:无序数组A,数组长度n
      • 临时变量
        • i遍历整个序列,j用来实现后移插入,temp保存关键字,low,high,mid实现折半查找
      • 运算过程
        • 两层循环,一层循环整个序列,二层有两个子循环,一子循环为折半查找,二子循环为后移插入
        • 一层循环内,先判断a[i]与前一个是否无序,若无序那就排序,temp保存关键字,low=0,high=i-1;进入二层循环,当low<=high的时候,mid=(low+high)/2,折半查找根据不同情况更改low或high的值,跳出循环说明找到位置,用j进行后移插入
    • 希尔排序:使用直接插入算法实现分组排序,组越分越小,最后完全有序
  • 交换排序
    • 冒泡排序:从后往前,挨个比较交换,每次排出一个最小的,前面为全局有序区
      • 接口:无序数组A,数组长度n
      • 临时变量
        • i表示i次遍历排出i个有序数列,j用来从后往前比较交换
      • 运算过程
        • 两层循环,一层用i表示i次排序,j用来从后向前直到i那里进行交换
    • 快速排序:每次将一个基准排到正确的位置,以此为基准划分左右两块区域,递归调用快速排序算法
      • 接口:无序数组A,low,high待排序区间
      • 临时变量
        • int pivot基准
      • 运算过程
        • 一层循环里面嵌套递归
        • 当low<high时循环,排序第一个关键字并获取基准,根据基准递归调用快速排序左右子序列
        • 划分函数
          • 接口:无序数组A,low,high
          • 返回值:基准物理位置
          • 临时变量
            • pivot基准保存待排序的基准关键字
          • 运算过程
            • 两层循环,一层左右遍历序列,二层用来左右横跳
            • 先保存第一个关键字为基准,当low<=high开始循环,先从后往前找到一个小于基准的往前放,然后从前往后找一个大于基准的往后放,最后跳出循环剩下的位置放基准,返回基准位置
  • 选择排序:每次选择一个最大或最小的放进全局有序区,
    • 简单选择排序:每次从后面找到一个最小的,往前放
      • 接口:无序数字A,长度n
      • 临时变量:i代表有序区,j遍历无序区,min保存最小下标
      • 运算过程
        • 两层循环,一层遍历n遍,二层遍历无序区找最小
        • 当i<n循环,min取i,用j从后向前循环,若遇到比min还小的,min取而代之,循环完,发现min值改变,交换a[i],a[min]
    • 堆排序:将数组看成满二叉树的顺序存储结构,先从最后一个分支节点逐个筛选上浮,然后或得一个大根堆,将最大值根与最后一个叶子节点交换,然后再次对根节点进行筛选使之成为大根堆
      • 接口:无序数组A,长度n
      • 临时变量:
        • i用来循环建立初始根堆,以及逐次的根节点交换后排序
      • 运算过程:
        • 先建立大根堆,i初始为n/2表示最后一个分支节点,当i>=0时i–从后向前逐个进行筛选操作sift(a,i,n),形成大根堆
        • 然后交换根节点和最后一个叶子节点,对根节点进行筛选sift(a,1,i-1),循环i=n,i>1,i–从后向前,每次算拍好一个最大值,
        • 筛选函数sift:先保存待筛选关键字为temp,找出他的最大的一个孩子与父母对比,若比父母大则和父母交换,若破坏了自身大堆性则循环比较孩子和父母的关系,正常则跳出,这时找到temp的位置放入
          • 接口:无序数组a,low,high排序区间
          • 临时变量:
            • i用来表示父母和最后的位置,j表示孩子,temp保存待筛选关键字
          • 运算过程:
            • i=low,j=2*i,temp=a[i]
            • 一层循环调整大根堆并找到带筛选关键字的位置,先比较孩子大小,若孩子比父母大,a[i]=a[j]进行替换,若正常跳出循环,这个循环一直进行到正常,保证替换后的都是大根堆,最后i表示筛选后的位置,a[i]=temp;
  • 归并排序:不断二路基本归并,归并的长度2的倍数递增直到为序列长度,需要一个额外的数组
    • 二路归并
      • 接口:无序数组A,low,mid,high表示归并的区间
      • 临时变量:r1接受比较后的序列,i,j遍历二路,k遍历r1
      • 运算过程:
        • 一层循环分别比较二路,哪边小放入r1
        • 将二路剩下录入r1
        • r1反过来给r,销毁r1
  • 基数排序:根据基数排序,排位数次,重要性从小到大的排序
  • 算法对比
    • 插入排序
      • 简单插入
      • 折半插入
      • 希尔排序
    • 交换排序
      • 冒泡排序
      • 快速排序
    • 选择排序
      • 简单选择排序
      • 堆排序
    • 归并排序
    • 基数排序
    • 时间复杂度
      • 初级算法都是n^2
      • 改进算法都是nlogn
      • 希尔排序和基数排序特殊
      • 插入和冒泡排序有最好情况,快速排序有最差情况为n^2
    • 空间复杂度
      • 快速排序:log_2 n
      • 二路归并: n
      • 基数:r
    • 稳定性
      • 直,冒,归,基稳定
    • 全局有序
      • 交换排序和选择排序