- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
插入排序与快速排序
插入排序和快速排序 学习目标 了解排序的定义 了解内排序和外排序的基本概念 掌握插入排序和快速排序 掌握他们在最坏、最好、平均情况下的时间复杂度 能够判断排序算法是否稳定 重点和难点 重点如下: 插入排序 快速排序 难点如下: 快速排序 排序算法的时间复杂度 什么是排序 内部排序与外部排序 排序的分类 按排序过程依据的不同原则进行分类: 插入排序、 交换排序、 选择排序、 归并排序和 基数排序 排序的时间复杂性 稳定排序与不稳定排序 插入排序——直接插入排序 直接插入排序算法描述 直接插入排序 void insertsort(ElemType R[],int n) //待排序元素用一个数组R表示,数组有n个元素 { for ( int i=1; in; i++) //i表示插入次数,共进行n-1次插入 { ElemType temp=R[i]; //把待排序元素赋给temp int j=i-1; while ((j=0) (tempR[j])) { R[j+1]=R[j]; j--; } // 顺序比较和移动 R[j+1]=temp; } } 直接插入排序的效率分析 从空间来看,它只需要一个元素的辅助空间,用于元素的位置交换。 从时间分析,首先外层循环要进行n-1次插入,每次插入最少比较一次(正序),移动两次;最多比较i次,移动i+2次(逆序)(i=1,2,…,n-1)。 compareMin=n-1 compareMax=1+2+…+n-1=(n2-n)/2 moveMin=2(n-1) moveMax=3+4+…+n+1=(n2+3n-4)/2 因此,直接插入排序的最坏时间复杂度为O(n2)。 直接插入算法的元素移动是顺序的,该方法是稳定的。 直接插入排序 平均情况复杂度 对每个 i 值,考虑平均情况下需要多少次比较。为简化分析,假设所有的值是不相同的,对一个 i 和临时变量 x, x 有 i+1 个位置可能会去 直接插入排序 平均情况复杂度 在对序列没有其它任何信息的条件下, x 到任何一个位置的概率都是1/(i+1). 这样, 对一个特定的值i , 需要的平均比较次数为: 把所有n-1次插入累加起来, 有: 快速排序 快排序—算法思想 通过一趟排序将待排序记录分割成三段:左段,中段(支点), 和右段, 使左段中各元素都小于等于支点,右段中各元素都大于等于支点,则可分别对左右两部分记录继续分别进行排序,以达到整个序列有序。 快速排序 快速排序 快排序---分割过程 int Partition(T Array[], int low, int high){ T pivot = Array[low]; while(low high){ while(low high Array[high] = pivot) high --; Array[low] = Array[high]; while(low high Array[low] = pivot) low++; Array[high] = Array[low]; } Array[low] = pivot; return low; } 快速排序 快排序---算法 快排序算法是个递归地对序列进行分割的过程,递归终止的条件是最终序列长度为1 快速排序 快排序---算法 void QuickSort(T Array[], int low, int high){ int PivotLocation; if(low high){ PivotLocation = Partition(Array, low, high); QuickSort(Array, low, PivotLocation-1); QuickSort(Array, PivotLocation+1, high); } } 快速排序的效率分析 快速排序的效率分析 快速排序的效率分析 快速排序的效率分析 因此在理论上已经证明,快速排序的平均时间复杂度为O(nlogn)。 同理,在最好的情况下,快速排序的时间复杂度也为O(nlogn) 若快速排序出现最坏的情形(每次能划分成两个子区间,但其中一个是空),则这时得到的二叉树是一棵单分枝树,得到的非空子区间包含有n-i个(i代表二叉树的层
文档评论(0)