本系列文章为浙江大学陈越、何钦铭数据结构学习笔记,前面的系列文章链接如下:
数据结构基础:P1-基本概念
数据结构基础:P2.1-线性结构—>线性表
数据结构基础:P2.2-线性结构—>堆栈
数据结构基础:P2.3-线性结构—>队列
数据结构基础:P2.4-线性结构—>应用实例:多项式加法运算
数据结构基础:P2.5-线性结构—>应用实例:多项式乘法与加法运算-C实现
数据结构基础:P3.1-树(一)—>树与树的表示
数据结构基础:P3.2-树(一)—>二叉树及存储结构
数据结构基础:P3.3-树(一)—>二叉树的遍历
数据结构基础:P3.4-树(一)—>小白专场:树的同构-C语言实现
数据结构基础:P4.1-树(二)—>二叉搜索树
数据结构基础:P4.2-树(二)—>二叉平衡树
数据结构基础:P4.3-树(二)—>小白专场:是否同一棵二叉搜索树-C实现
数据结构基础:P4.4-树(二)—>线性结构之习题选讲:逆转链表
数据结构基础:P5.1-树(三)—>堆
数据结构基础:P5.2-树(三)—>哈夫曼树与哈夫曼编码
数据结构基础:P5.3-树(三)—>集合及运算
数据结构基础:P5.4-树(三)—>入门专场:堆中的路径
数据结构基础:P5.5-树(三)—>入门专场:File Transfer
数据结构基础:P6.1-图(一)—>什么是图
数据结构基础:P6.2-图(一)—>图的遍历
数据结构基础:P6.3-图(一)—>应用实例:拯救007
数据结构基础:P6.4-图(一)—>应用实例:六度空间
数据结构基础:P6.5-图(一)—>小白专场:如何建立图-C语言实现
数据结构基础:P7.1-图(二)—>树之习题选讲:Tree Traversals Again
数据结构基础:P7.2-图(二)—>树之习题选讲:Complete Binary Search Tree
数据结构基础:P7.3-图(二)—>树之习题选讲:Huffman Codes
数据结构基础:P7.4-图(二)—>最短路径问题
数据结构基础:P7.5-图(二)—>哈利·波特的考试
数据结构基础:P8.1-图(三)—>最小生成树问题
数据结构基础:P8.2-图(三)—>拓扑排序
数据结构基础:P8.3-图(三)—>图之习题选讲-旅游规划
文章目录
前言
什么是排序呢?我相信这个不用我废话你肯定知道。如果我们讨论的是把十几二十个数按照从小到大的顺序排好,那么一个幼儿园的小朋友如果他识数,并且他知道什么是大什么是小,那么小朋友也可以做这件事情。如果我们在这要讨论的是10000个数据起步的规模的排序,那么排序算法的效率就变得非常的重要。
在介绍各种排序算法之前,我们先来讲清楚几个前提条件
一、冒泡排序
假设我们有这么一堆的泡泡,我们的目标是要把那个最小的泡泡排在最上面,最大的泡泡排在最下面。
对应代码如下:
void Bubble_Sort( ElementType A[], int N )
{
//控制循环次数,每次要遍历的泡泡依次少一个
for ( P=N-1; P>=0; P-- ){
flag = 0; //标记是否发生了交换
for( i=0; i<P; i++ ) { /* 一趟冒泡 */
if ( A[i] > A[i+1] ) {
Swap(A[i], A[i+1]);
flag = 1; /* 标识发生了交换 */
}
}
if ( flag==0 ) break; /* 全程无交换,直接跳出,已经有序 */
}
}
算法复杂度:
冒泡排序的优缺点:
二、插入排序
另外一个非常简单的排序算法叫做插入排序。插入排序可以理解为我们怎么抓一手牌。
对应代码如下:
void Insertion_Sort( ElementType A[], int N )
{
//从1开始,默认我们有第一张牌
for ( P=1; P<N; P++ ) {
Tmp = A[P]; /* 摸下一张牌 */
for ( i=P; i>0 && A[i-1]>Tmp; i-- )
A[i] = A[i-1]; /* 移出空位 */
A[i] = Tmp; /* 新牌落位 */
}
}
算法复杂度:
例子:
三、时间复杂度下界
冒泡排序和插入排序都属于简单排序,它们都有公共的时间复杂度下界。要理解这个问题,我们先介绍一个新的概念:逆序对
逆序对:
问题:
插入排序的时间复杂度:
对于更一般的情况,我们有下面这样的定理: