《内部排序》课件_第1页
《内部排序》课件_第2页
《内部排序》课件_第3页
《内部排序》课件_第4页
《内部排序》课件_第5页
已阅读5页,还剩121页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chapter10排序Chapter10排序1排序的基本概念直接插入排序起泡排序简单选择排序快速排序堆排序排序的基本概念6.1基本概念6.1基本概念3排序排序在计算机程序设计中有着非常重要的地位,许多具体应用要求对数据进行排序,而许多复杂的算法也要求以排序为基础。排序排序在计算机程序设计中有着非常重要的地位,许多具体应用要排序排序:将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。

数据表(datalist):它是待排序数据对象的有限集合。主关键字(key):数据对象有多个属性域,即多个数据成员组成,其中有一个属性域可用来区分对象,作为排序依据,称为关键字。也称为排序码。排序排序:将一个数据元素的任意序列,重新排列成一个按关键字有排序有关排序的几个基本问题稳定与不稳定内部排序与外部排序(本章只关注内部排序)性能的衡量排序有关排序的几个基本问题排序方法的分类按照排序思想插入排序交换排序选择排序归并排序基数排序按照时间复杂度简单排序先进排序其他排序方法的分类按照排序思想6.2直接插入排序6.2直接插入排序8直接插入排序基本思想:如果要向一个已经排序的顺序表中插入元素且保持表的有序性,则只需先依次比较,找到该元素的位置,然后移动元素进行插入即可。时间复杂度是O(n).基于这一思想,如果要对一个表进行排序,则可以将表看作两个部分,前N个元素已经排好序,再将第N+1个元素插入到前N个元素中。从N=0开始重复这个过程,直到N=L。直接插入排序基本思想:如果要向一个已经排序的顺序表中插入元素直接插入排序012345tempi=1i=2012345temp2108254925*162125084925*16252125084925*162125084925*16492125084925*16i=32125084925*1625*2125084925*16直接插入排序012直接插入排序i=4i=52125084925*1616162125084925*162125084925*162125084925*1608直接插入排序i=4i=52125084925*161直接插入排序直接插入排序的算法typedefintSortData;voidInsertSort(SortDataV[],intn){//按非递减顺序对表进行排序SortDatatemp;inti,j;for(i=1;i<n;i++){temp=V[i];for(j=i;j>0;j--)//从后向前顺序比较if(temp<V[j-1])V[j]=V[j-1];elsebreak;V[j]=temp;}}

直接插入排序直接插入排序的算法直接插入排序时间复杂度为O(n^2)直接插入排序时间复杂度为O(n^2)折半插入排序可见,插入排序由“查找”和“移动”两个基本过程组成,而查找这一步骤实际上是在一个有序表中进行的,因此可以用折半查找代替顺序查找来提高效率。但是由于移动这一过程无法被简化,因此折半插入排序仍然保值O(n^2)的时间复杂度。折半插入排序可见,插入排序由“查找”和“移动”两个基本过程组链表上的插入排序链表上的插入排序仍然无法回避比较的过程,但是无需移动元素,从总体上看比顺序表上插入排序的性能好一些。链表上的插入排序链表上的插入排序仍然无法回避比较的过程,但是6.3起泡排序6.3起泡排序16起泡排序基本思想:基于两两比较的思想,对于N个元素,如果从第一个开始两两比较,将较小(较大)的一个交换到后面,则经过N-1次比较之后,最小(最大)的元素就被移动到最后一个位置。基于这一思想,如果要对一个表进行排序,则可以先对全部元素进行两两比较,将最小(最大)的元素移动到最后,再对前N-1元素重复过程,再对前N-2个……直到所有的元素都排好序。起泡排序基本思想:基于两两比较的思想,对于N个元素,如果从第起泡排序210825492516214925251608214925251608214925251608214925251608初始关键字第一趟排序第四趟排序第二趟排序第三趟排序214925251608第五趟排序起泡排序21082549251621492525160821起泡排序起泡排序的基本算法typedefintSortData;voidBubbleSort(SortDataa[],intn){ for(inti=0;i<n;i++){ for(intj=0;j<n-i-1;j++){ if(a[j]>a[j+1]) { inttemp=0; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } }

}}起泡排序起泡排序的基本算法起泡排序最多做n-1趟起泡就能把所有对象排好序。在对象的初始排列已经按排序码从小到大排好序时,此算法只执行一趟起泡,做n-1次排序码比较,不移动对象。这是最好的情形。时间复杂度是O(n^2)。起泡排序起泡排序起泡排序的改进:在上面的程序中,如果序列经过很少几次循环就已经完成了排序,程序仍然会执行N-1次循环,造成多次循环做无用功。例如对于下面的序列,实际上经过一次循环就已经有序了。210825492516起泡排序210825492516起泡排序对于这种情况,我们可以设置一个标志,如果一次循环发生数据交换,则令标志为1;如果一次循环不发生数据交换,则令标志为0,当发现标志为0时,就意味着已经排序完成了。起泡排序起泡排序typedefintSortData;voidBubbleSort(SortDataV[],intn){inti=1;intexchange=1;while(i<n&&exchange){exchange=0; //标志置为0,假定未交换for(intj=n-1;j>=i;j--)if(V[j-1]>V[j]){ //逆序 Swap(V[j-1],V[j]);//交换 exchange=1;//标志置为1,有交换}i++;}}起泡排序typedefintSortData;起泡排序扩展阅读:双冒泡排序。起泡排序链表上的起泡排序思考:在链表上进行起泡排序,相比顺序表有哪些不同?1:从前向后的过程,需要借助两个指针来完成。2:需要用另外一个指针来指示已经被移动到最后的若干个元素。3:交换的过程有不同做法。实现起来比较繁琐,建议课下练习。链表上的起泡排序思考:在链表上进行起泡排序,相比顺序表有哪些6.4简单选择排序6.4简单选择排序26简单选择排序在一组数据中选择具有最小排序关键字的一个。若它不是这组数据中的第一个,则将它与这组数据中的第一个对调;在剩下的N-1个数据中重复执行第①、②步,直到完成。简单选择排序在一组数据中选择具有最小排序关键字的一个。简单选择排序简单选择排序的排序过程21254925*16082125*i=0492516251608490825*4921i=1i=2081625*2521初始交换21,08交换25,16交换49,21简单选择排序简单选择排序的排序过程21254925*1608简单选择排序简单选择排序的基本算法typedefintSortData;voidSelectSort(SortDataV[],intn){for(inti=0;i<n-1;i++){intk=i;//选择具有最小排序码的对象for(intj=i+1;j<n;j++)if(V[j]<V[k])k=j;//当前具最小排序码的对象if(k!=i)//对换到第i个位置 Swap(V[i],V[k]);} }简单选择排序简单选择排序的基本算法简单选择排序时间复杂度仍为O(n^2)简单选择排序时间复杂度仍为O(n^2)链表上的简单选择排序链表上的简单选择排序,最主要的区别仍然是元素的交换过程,可以采用与起泡相同的策略:只交换值交换节点链表上的简单选择排序链表上的简单选择排序,最主要的区别仍然是简单选择排序的递归实现终止条件:表中只剩一个元素子问题:对后N-1个元素组成的表进行简单选择排序。子问题的操作:让第一个元素与最小元素进行交换,然后对剩余的N-1个元素进行简单选择排序。简单选择排序的递归实现终止条件:表中只剩一个元素简单选择排序的递归实现voidSelectSort(inta[],intstart,intn){ if(n-start>1){ intk=start; for(inti=start;i<n;i++)//查找 { if(a[k]>a[i]) k=i; } inttemp=a[start];a[start]=a[k];a[k]=temp; SelectSort(a,start+1,n); }}简单选择排序的递归实现voidSelectSort(int三种排序算法的比较上面介绍的三种排序算法都是基本排序算法,思路也比较简单和直接。时间复杂度为O(n^2)基本过程都是将表划分为两部分,一部分已经排好序,一部分没有排好序,按照某种规则将未排序部分的元素加入到已排序部分。在实现时,都需要两层循环。三种排序算法的比较上面介绍的三种排序算法都是基本排序算法,思三种排序算法的比较主要的区别就在于“如何从未排序的部分选择元素,加入到已排序部分?”插入排序:随意选择,有序插入。起泡排序:相邻元素两两比较,将最小(最大)的元素附加到已排序部分最前面(自然保证有序)。选择排序:查找最小(最大)元素,将这个元素附加到已排序部分的最后(自然保证有序)。三种排序算法的比较主要的区别就在于“如何从未排序的部分选择元6.5快速排序6.5快速排序36快速排序基本思想是任取待排序对象序列中的某个对象(例如取第一个对象)作为基准,按照该对象的排序码大小,将整个对象序列划分为左右两个子序列:

左侧子序列中所有对象的排序码都小于或等于基准对象的排序码右侧子序列中所有对象的排序码都大于基准对象的排序码快速排序基本思想是任取待排序对象序列中的某个对象(例如取第快速排序经过这样的处理,基准对象就被安置在了正确的位置。然后分别对左右两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止。基准对象也称为枢轴(或支点)记录。快速排序经过这样的处理,基准对象就被安置在了正确的位置。快速排序2108254925*16初始关键字08254925*162108254925*1608254925*1608254925*1608254925*1621prikey一次交换二次交换三次交换四次交换完成一趟排序ijijjiijjiji快速排序2108254925*16初始关键字08254925快速排序08254925*1621完成一趟排序分别进行快速排序08254925*1621有序序列08254925*1621快速排序08254925*1621完成一趟排序分别进行快速排快速排序快速排序的基本代码voidQuickSort(SqList&L,intlow,inthigh){ //在序列lowhigh中递归地进行快速排序if(low<high){ intpivotloc=Partition(L,low,high);//划分 QuickSort(L,low,pivotloc-1);//对左序列同样处理 QuickSort(L,pivotloc+1,high);//对右序列同样处理}}快速排序快速排序的基本代码快速排序intPartition(SqList&L,intlow,inthigh){ pivotkey=L.r[low].key;//基准对象关键字 while(low<high){ while(low<high&&L.r[high].key>=pivotkey) --high; L.r[low]>L.r[high];//小于基准的移到左侧 while(low<high&&L.r[low].key<=pivotkey) ++low; L.r[high]>L.r[low];//大于基准的移到右侧 } returnlow;}快速排序intPartition(SqList&L,快速排序快速排序的时间复杂度为O(nlogn),是最快的内排序算法之一但是,由于快速排序的过程比较复杂,在对很短的序列进行排序时,它的速度不如插入/比较/选择排序。快速排序快速排序的时间复杂度为O(nlogn),是最快的内排快速排序快速排序的改进判断序列的长度,当小于特定长度时,就改用其他排序方法。使用非递归的方法。快速排序快速排序的改进快速排序快速排序是“20世纪十大著名算法”之一。单纯形法蒙特卡洛模拟快速傅里叶变换快速排序快速排序是“20世纪十大著名算法”之一。6.6堆排序6.6堆排序46堆首先介绍一种新的数据结构:堆(Heap)。堆是一种特殊的二叉树,首先,它是一个完全二叉树,并且对于任意一个非叶子节点,其叶子的值都大于(小于)该节点的值。相应的,称其为一个大顶堆(小顶堆)。注意:与二叉排序树的概念相区分。堆必须是一个完全二叉树节点值的大小只关注上下层而不分左右堆首先介绍一种新的数据结构:堆(Heap)。堆090987877878454565653131532323531717小顶堆大顶堆堆09098787787845456565313153232堆的建立思考:如何将一个任意的完全二叉树变成一个堆。算法基本思路:从最后一个非叶子节点开始(从上到下,从左到右的顺序),对于每一个非叶子节点重复执行以下操作(以调整为大顶堆为例):将节点的值(k)与它的两个叶子节点的值(k1,k2)进行比较,并且:如果满足大顶堆的性质(k>k1且k>k2),则不进行操作,退出循环。如果不满足,则将其与叶子节点中较大的一个进行交换,并继续执行循环。堆的建立思考:如何将一个任意的完全二叉树变成一个堆。堆的建立以一个小顶堆的建立过程为例5353171778780923456587最后一个0923456587倒数第二个堆的建立以一个小顶堆的建立过程为例5353171778780堆的建立以一个小顶堆的建立过程为例53531717787809234565870923456587注意这一次调整有点麻烦堆的建立以一个小顶堆的建立过程为例5353171778780堆的建立以一个小顶堆的建立过程为例53171778780923456587092345658753堆的建立以一个小顶堆的建立过程为例5317177878092堆的建立以一个小顶堆的建立过程为例53171778780923456587092345658753堆的建立以一个小顶堆的建立过程为例5317177878092堆的建立至此,小顶堆的建立就完成了。堆的建立至此,小顶堆的建立就完成了。堆排序那么如何使用“堆”这种数据结构来排序呢?只需要如下的过程:将堆中最后一个节点与根节点交换,并且将调整之后的最后一个节点输出出来,就得到了目前堆中最小(最大)的元素。将剩余的N-1个元素重新调整成堆(这一步只需要针对根节点进行调整就可以)。重复以上过程直到全部元素都被输出了。堆排序那么如何使用“堆”这种数据结构来排序呢?堆排序以利用大顶堆进行排序的过程为例:492525*211608012345082525*162149025431交换8与49,并输出49堆排序以利用大顶堆进行排序的过程为例:492525*2116堆排序以利用大顶堆进行排序的过程为例:2525*082116490123451625*08252149025431重新调整为大顶堆,然后交换25与16,并输出25堆排序以利用大顶堆进行排序的过程为例:2525*082116堆排序以利用大顶堆进行排序的过程为例:25*1608212549012345081625*252149025431重新调整为大顶堆,然后交换25与8,并输出25堆排序以利用大顶堆进行排序的过程为例:25*16082125堆排序以利用大顶堆进行排序的过程为例:211625*082549012345081625*252149025431重新调整为大顶堆,然后交换21与8,并输出21堆排序以利用大顶堆进行排序的过程为例:211625*0825堆排序以利用大顶堆进行排序的过程为例:160825*212549012345081625*252149025431重新调整为大顶堆,然后交换8与16,并输出16堆排序以利用大顶堆进行排序的过程为例:160825*2125堆排序以利用大顶堆进行排序的过程为例:080现在堆中只剩下一个元素了,输出,完成排序。堆排序以利用大顶堆进行排序的过程为例:080现在堆中只剩下一堆排序堆排序的过程很繁琐,这导致它在数据量很小的情况下性能不佳。但是它的时间复杂度是nlogn级别的,特别是即使在最坏情况下,它的时间复杂度仍然保持nlogn,这是它相对快速排序最大的优势。堆排序堆排序的过程很繁琐,这导致它在数据量很小的情况下性能不堆排序的程序实现堆有一个很好的性质(思考:哪一点?),利用这一点,可以在一个顺序结构上实现堆排序。“完全二叉树”这一性质还决定了在顺序存储时,如果从顺序表的第一个位置开始存储(第0个位置留空),并且树的第一个节点存储在第k个位置,则它的根节点就在第k/2个位置。把握上面两点,二叉排序树的程序实现就很容易理解了。课本算法10.10,10.11.堆排序的程序实现堆有一个很好的性质(思考:哪一点?),利用这Chapter10排序Chapter10排序64排序的基本概念直接插入排序起泡排序简单选择排序快速排序堆排序排序的基本概念6.1基本概念6.1基本概念66排序排序在计算机程序设计中有着非常重要的地位,许多具体应用要求对数据进行排序,而许多复杂的算法也要求以排序为基础。排序排序在计算机程序设计中有着非常重要的地位,许多具体应用要排序排序:将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。

数据表(datalist):它是待排序数据对象的有限集合。主关键字(key):数据对象有多个属性域,即多个数据成员组成,其中有一个属性域可用来区分对象,作为排序依据,称为关键字。也称为排序码。排序排序:将一个数据元素的任意序列,重新排列成一个按关键字有排序有关排序的几个基本问题稳定与不稳定内部排序与外部排序(本章只关注内部排序)性能的衡量排序有关排序的几个基本问题排序方法的分类按照排序思想插入排序交换排序选择排序归并排序基数排序按照时间复杂度简单排序先进排序其他排序方法的分类按照排序思想6.2直接插入排序6.2直接插入排序71直接插入排序基本思想:如果要向一个已经排序的顺序表中插入元素且保持表的有序性,则只需先依次比较,找到该元素的位置,然后移动元素进行插入即可。时间复杂度是O(n).基于这一思想,如果要对一个表进行排序,则可以将表看作两个部分,前N个元素已经排好序,再将第N+1个元素插入到前N个元素中。从N=0开始重复这个过程,直到N=L。直接插入排序基本思想:如果要向一个已经排序的顺序表中插入元素直接插入排序012345tempi=1i=2012345temp2108254925*162125084925*16252125084925*162125084925*16492125084925*16i=32125084925*1625*2125084925*16直接插入排序012直接插入排序i=4i=52125084925*1616162125084925*162125084925*162125084925*1608直接插入排序i=4i=52125084925*161直接插入排序直接插入排序的算法typedefintSortData;voidInsertSort(SortDataV[],intn){//按非递减顺序对表进行排序SortDatatemp;inti,j;for(i=1;i<n;i++){temp=V[i];for(j=i;j>0;j--)//从后向前顺序比较if(temp<V[j-1])V[j]=V[j-1];elsebreak;V[j]=temp;}}

直接插入排序直接插入排序的算法直接插入排序时间复杂度为O(n^2)直接插入排序时间复杂度为O(n^2)折半插入排序可见,插入排序由“查找”和“移动”两个基本过程组成,而查找这一步骤实际上是在一个有序表中进行的,因此可以用折半查找代替顺序查找来提高效率。但是由于移动这一过程无法被简化,因此折半插入排序仍然保值O(n^2)的时间复杂度。折半插入排序可见,插入排序由“查找”和“移动”两个基本过程组链表上的插入排序链表上的插入排序仍然无法回避比较的过程,但是无需移动元素,从总体上看比顺序表上插入排序的性能好一些。链表上的插入排序链表上的插入排序仍然无法回避比较的过程,但是6.3起泡排序6.3起泡排序79起泡排序基本思想:基于两两比较的思想,对于N个元素,如果从第一个开始两两比较,将较小(较大)的一个交换到后面,则经过N-1次比较之后,最小(最大)的元素就被移动到最后一个位置。基于这一思想,如果要对一个表进行排序,则可以先对全部元素进行两两比较,将最小(最大)的元素移动到最后,再对前N-1元素重复过程,再对前N-2个……直到所有的元素都排好序。起泡排序基本思想:基于两两比较的思想,对于N个元素,如果从第起泡排序210825492516214925251608214925251608214925251608214925251608初始关键字第一趟排序第四趟排序第二趟排序第三趟排序214925251608第五趟排序起泡排序21082549251621492525160821起泡排序起泡排序的基本算法typedefintSortData;voidBubbleSort(SortDataa[],intn){ for(inti=0;i<n;i++){ for(intj=0;j<n-i-1;j++){ if(a[j]>a[j+1]) { inttemp=0; temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } }

}}起泡排序起泡排序的基本算法起泡排序最多做n-1趟起泡就能把所有对象排好序。在对象的初始排列已经按排序码从小到大排好序时,此算法只执行一趟起泡,做n-1次排序码比较,不移动对象。这是最好的情形。时间复杂度是O(n^2)。起泡排序起泡排序起泡排序的改进:在上面的程序中,如果序列经过很少几次循环就已经完成了排序,程序仍然会执行N-1次循环,造成多次循环做无用功。例如对于下面的序列,实际上经过一次循环就已经有序了。210825492516起泡排序210825492516起泡排序对于这种情况,我们可以设置一个标志,如果一次循环发生数据交换,则令标志为1;如果一次循环不发生数据交换,则令标志为0,当发现标志为0时,就意味着已经排序完成了。起泡排序起泡排序typedefintSortData;voidBubbleSort(SortDataV[],intn){inti=1;intexchange=1;while(i<n&&exchange){exchange=0; //标志置为0,假定未交换for(intj=n-1;j>=i;j--)if(V[j-1]>V[j]){ //逆序 Swap(V[j-1],V[j]);//交换 exchange=1;//标志置为1,有交换}i++;}}起泡排序typedefintSortData;起泡排序扩展阅读:双冒泡排序。起泡排序链表上的起泡排序思考:在链表上进行起泡排序,相比顺序表有哪些不同?1:从前向后的过程,需要借助两个指针来完成。2:需要用另外一个指针来指示已经被移动到最后的若干个元素。3:交换的过程有不同做法。实现起来比较繁琐,建议课下练习。链表上的起泡排序思考:在链表上进行起泡排序,相比顺序表有哪些6.4简单选择排序6.4简单选择排序89简单选择排序在一组数据中选择具有最小排序关键字的一个。若它不是这组数据中的第一个,则将它与这组数据中的第一个对调;在剩下的N-1个数据中重复执行第①、②步,直到完成。简单选择排序在一组数据中选择具有最小排序关键字的一个。简单选择排序简单选择排序的排序过程21254925*16082125*i=0492516251608490825*4921i=1i=2081625*2521初始交换21,08交换25,16交换49,21简单选择排序简单选择排序的排序过程21254925*1608简单选择排序简单选择排序的基本算法typedefintSortData;voidSelectSort(SortDataV[],intn){for(inti=0;i<n-1;i++){intk=i;//选择具有最小排序码的对象for(intj=i+1;j<n;j++)if(V[j]<V[k])k=j;//当前具最小排序码的对象if(k!=i)//对换到第i个位置 Swap(V[i],V[k]);} }简单选择排序简单选择排序的基本算法简单选择排序时间复杂度仍为O(n^2)简单选择排序时间复杂度仍为O(n^2)链表上的简单选择排序链表上的简单选择排序,最主要的区别仍然是元素的交换过程,可以采用与起泡相同的策略:只交换值交换节点链表上的简单选择排序链表上的简单选择排序,最主要的区别仍然是简单选择排序的递归实现终止条件:表中只剩一个元素子问题:对后N-1个元素组成的表进行简单选择排序。子问题的操作:让第一个元素与最小元素进行交换,然后对剩余的N-1个元素进行简单选择排序。简单选择排序的递归实现终止条件:表中只剩一个元素简单选择排序的递归实现voidSelectSort(inta[],intstart,intn){ if(n-start>1){ intk=start; for(inti=start;i<n;i++)//查找 { if(a[k]>a[i]) k=i; } inttemp=a[start];a[start]=a[k];a[k]=temp; SelectSort(a,start+1,n); }}简单选择排序的递归实现voidSelectSort(int三种排序算法的比较上面介绍的三种排序算法都是基本排序算法,思路也比较简单和直接。时间复杂度为O(n^2)基本过程都是将表划分为两部分,一部分已经排好序,一部分没有排好序,按照某种规则将未排序部分的元素加入到已排序部分。在实现时,都需要两层循环。三种排序算法的比较上面介绍的三种排序算法都是基本排序算法,思三种排序算法的比较主要的区别就在于“如何从未排序的部分选择元素,加入到已排序部分?”插入排序:随意选择,有序插入。起泡排序:相邻元素两两比较,将最小(最大)的元素附加到已排序部分最前面(自然保证有序)。选择排序:查找最小(最大)元素,将这个元素附加到已排序部分的最后(自然保证有序)。三种排序算法的比较主要的区别就在于“如何从未排序的部分选择元6.5快速排序6.5快速排序99快速排序基本思想是任取待排序对象序列中的某个对象(例如取第一个对象)作为基准,按照该对象的排序码大小,将整个对象序列划分为左右两个子序列:

左侧子序列中所有对象的排序码都小于或等于基准对象的排序码右侧子序列中所有对象的排序码都大于基准对象的排序码快速排序基本思想是任取待排序对象序列中的某个对象(例如取第快速排序经过这样的处理,基准对象就被安置在了正确的位置。然后分别对左右两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止。基准对象也称为枢轴(或支点)记录。快速排序经过这样的处理,基准对象就被安置在了正确的位置。快速排序2108254925*16初始关键字08254925*162108254925*1608254925*1608254925*1608254925*1621prikey一次交换二次交换三次交换四次交换完成一趟排序ijijjiijjiji快速排序2108254925*16初始关键字08254925快速排序08254925*1621完成一趟排序分别进行快速排序08254925*1621有序序列08254925*1621快速排序08254925*1621完成一趟排序分别进行快速排快速排序快速排序的基本代码voidQuickSort(SqList&L,intlow,inthigh){ //在序列lowhigh中递归地进行快速排序if(low<high){ intpivotloc=Partition(L,low,high);//划分 QuickSort(L,low,pivotloc-1);//对左序列同样处理 QuickSort(L,pivotloc+1,high);//对右序列同样处理}}快速排序快速排序的基本代码快速排序intPartition(SqList&L,intlow,inthigh){ pivotkey=L.r[low].key;//基准对象关键字 while(low<high){ while(low<high&&L.r[high].key>=pivotkey) --high; L.r[low]>L.r[high];//小于基准的移到左侧 while(low<high&&L.r[low].key<=pivotkey) ++low; L.r[high]>L.r[low];//大于基准的移到右侧 } returnlow;}快速排序intPartition(SqList&L,快速排序快速排序的时间复杂度为O(nlogn),是最快的内排序算法之一但是,由于快速排序的过程比较复杂,在对很短的序列进行排序时,它的速度不如插入/比较/选择排序。快速排序快速排序的时间复杂度为O(nlogn),是最快的内排快速排序快速排序的改进判断序列的长度,当小于特定长度时,就改用其他排序方法。使用非递归的方法。快速排序快速排序的改进快速排序快速排序是“20世纪十大著名算法”之一。单纯形法蒙特卡洛模拟快速傅里叶变换快速排序快速排序是“20世纪十大著名算法”之一。6.6堆排序6.6堆排序109堆首先介绍一种新的数据结构:堆(Heap)。堆是一种特殊的二叉树,首先,它是一个完全二叉树,并且对于任意一个非叶子节点,其叶子的值都大于(小于)该节点的值。相应的,称其为一个大顶堆(小顶堆)。注意:与二叉排序树的概念相区分。堆必须是一个完全二叉树节点值的大小只关注上下层而不分左右堆首先介绍一种新的数据结构:堆(Heap)。堆090987877878454565653131532323531717小顶堆大顶堆堆09098787787845456565313153232堆的建立思考:如何将一个任意的完全二叉树变成一个堆。算法基本思路:从最后一个非叶子节点开始(从上到下,从左到右的顺序),对于每一个非叶子节点重复执行以下操作(以调整为大顶堆为例):将节点的值(k)与它的两个叶子节点的值(k1,k2)进行比较,并且:如果满足大顶堆的性质(k>k1且k>k2),则不进行操作,退出循环。如果不满足,则将其与叶子节点中较大的一个进行交换,并继续执行循环

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论