浙大公开课-数据结构-排序-笔记整理

去年我在网易公开课参加了浙大公开课-<数据结构>的学习.讲师是陈越姥姥和何钦铭先生.
今天我再次将之前的笔记做了整理.希望方便盆友们的学习.

排序算法是否稳定?

两个相同数据的先后顺序能否保证在排序后不变.

内排序和外排序

我们知道,按照待排序数据能否在你的内存中放得下,分为内排序外排序.

1冒泡排序的效率:

最快0(n)
最坏O(n^2)

优点:

  1. 简单
  2. 适合链表操作(只比较和修改相邻的数据)
  3. 稳定.

2插入排序的效率:

最快0(n)
最坏O(n^2)

优点:

  1. 简单
  2. 操作较少.每次比较最多移动一个数据.(相较于冒泡排序)
  3. 序列基本有序,则插入排序简单高效.
  4. 稳定.

逆序对:
对于下标i>j,如果A[i]>A[j],则称(i,j)是一对逆序对(inversion).

插入排序:T(N,I)=O(N+I);(I为逆序对)
N(N-1)/4个逆序对.

交换比较相邻的数据,每次对多消去一个逆序对.所以……

3希尔排序Sheel

插入的简便+克服插入每次只能消除一个逆序对.

定义增量序列:
原始序列是:n/2,n/4,……1;
但是这样的序列增量元素不互质,小增量就可能根本不起作用.

两种增量序列:

Hibbard增量序列:
Dk=2^k-1 (相邻互质)

Sedgewick增量序列:
9*4^i-9*2i+1
或者
4^i-3*2^i+1

这两种增量序列Sedgewick最坏情况和平均时间复杂度都要好一些.

4堆排序

回顾选择排序:
找到最小元,将该元放到队尾.重复这个过程.
O(n)
T(n^2)
选择排序,

改进选择排序的时间效率集中在了:快速找到最小元.

使用最小堆:
堆排序是对选择排序寻找最小元的改进.
时间复杂度:时间复杂度(nlogn)
但是最小堆排序后果是:需要一倍的内存.

进一步的改进是使用最大堆.
对于随机排列的N个不同元素
时间复杂度O(2NlogN-O(Nlog logN))

但是实际效果不如用Sedgewick增量序列的希尔排序.
其伪代码如下:
堆排序

什么时候适合选择排序(堆排序)?

排序操作不需要完全执行时,选择排序较为适合。
举个栗子:要得到最大的前K个的数。

3 归并排序-外排序时非常有用

核心:有序子咧的归并
T(N)=O(N)

递归算法:
分而治之
T(N)=T(N/2)+T(N/2)+O(N) => T(N)=O(NlogN)
稳定

非递归算法:
NLogN
稳定

4 快速排序

分而治之

N<2退出
1分:随机挑选主元.划分两个子集.
2治:两边递归

主元挑选方法
划分两个子集的方法

最好情况:
主元每次最好中分.
T(N)=O(NlogN)

主元的挑选方法:
头中尾取中位数.或者多个位置取中位数.

对于小规模数据(例如N<100)可能还不如插入排序快.
所以一种策略是:
当递归的数据规模充分小时,停止递归,直接调用简单排序.
这个阀值(Cutoff).

快速排序代码实现:
快速排序

还有常用排序算法效率和场景的总结和表排序以及基数排序的内容视情况总结.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
内容如下: ├─程序例子 │ │ Gauss.cpp │ │ MOVE.C │ │ RUIYUE_3.C │ │ RUIYUE_4.C │ │ │ ├─1概述 │ │ bb_sort.cpp │ │ ex1-9.cpp │ │ ex1-91.cpp │ │ │ ├─2线性表 │ │ ex2-11.cpp │ │ ex2-11new.cpp │ │ linklist.cpp │ │ linklist.h │ │ LINKQUEU.C │ │ linkqueue.cpp │ │ linkqueue.h │ │ list.c │ │ LIST2.C │ │ LIST_S15.C │ │ LIST_SL.C │ │ LIST_SQ.C │ │ LIST_SQ5.C │ │ new2-11.cpp │ │ old2-11.cpp │ │ SQLIST.C │ │ Sqlist.cpp │ │ UNION.CPP │ │ │ ├─3堆栈与队列 │ │ bank_simulation.cpp │ │ conversion.cpp │ │ DMXSTACK.C │ │ hanoi.cpp │ │ MAZE.CPP │ │ QUEUE09.C │ │ SQQUEUE.C │ │ Sqqueue.cpp │ │ sqstack.cpp │ │ stack.c │ │ STK_9.C │ │ 表达式求值.cpp │ │ │ ├─5数组 │ │ array.c │ │ array_ex.cpp │ │ array_test.cpp │ │ DK1.c │ │ DK2.c │ │ SANYANZU.C │ │ │ └─6树 │ bitree.cpp │ BITREE11.C │ bitree2.cpp │ BITREE23.C │ BITREE9.C │ Create_bitree.c │ inorder_thr_tree.cpp │ intreading.cpp │ TING6.C │ TRAVERSE.C │ └─课件 sjjg答疑.txt 数据结构1概述.ppt 数据结构2线性表1.ppt 数据结构3线性表2.ppt 数据结构4堆栈与队列1.ppt 数据结构5堆栈与队列2.ppt 数据结构6串.ppt 数据结构7数组1.ppt 数据结构8数组2.ppt 数据结构9树1.ppt 数据结构A树2.ppt 数据结构B树3.ppt 数据结构C图1.ppt 数据结构D图2.ppt 数据结构E查找.ppt 数据结构F排序.ppt 数据结构文稿14.ppt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值