全部科目 > 程序员 >
2016年下半年 下午试卷 案例
第 3 题
知识点 快速排序   排序  
 
 
【说明】
下面的程序利用快速排序中划分的思想在整数序列中找出第k小的元素(即将元素从小到大排序后,取第k个元素)。
对一个整数序列进行快速排序的方法是:在待排序的整数序列中取第一个数作为基准值,然后根据基准值进行划分,从而将待排序的序列划分为不大于基准值者(称为左子序列)和大于基准值者(称为右子序列),然后再对左子序列和右子序列分别进行快速排序,最终得到非递减的有序序列。
例如,整数序列“19,12,30,11,7,53,78,25"的第3小元素为12。整数序列“19,12,7,30,11,11,7,53,78,25,7"的第3小元素为7。
函数partition(int a[],int low,int high)以a[low]的值为基准,对a[low],a[low+1],…,a[high]进行划分,最后将该基准值放入a[i](low≤i≤high),并使得a[low],a[low+1],...,a[i-1]都小于或等于a[i],而a[i+1],a[i+2],...,a[high]都大于a[i]。
函教findkthElem(int a[],int startIdx,int endIdx,inr k)在a[startIdx],a[startIdx+1],...,a[endIdx]中找出第k小的元素。
【代码】
 
问题:3.1   阅读以下说明和代码,填补代码中的空缺,将解答填入答题纸的对应栏内。




 
 
 
知识点讲解
· 快速排序
· 排序
 
        快速排序
        快速排序(Quick Sort)的主要思路为:通过对线性表序列的一趟扫描使某个结点移到中间的某个位置,且使其左边序列各结点的关键字都比该结点的关键字小,而其右边序列各结点的关键字都不比该结点的关键字小,常称这样的一次扫描为"划分"。然后,对左、右序列进行同样的处理,直到所有序列均只包含一个结点为止,这样便可将原线性表排好序。
        快速排序可以看作是冒泡排序的改进,冒泡排序可以看作是快速排序的退化,即每趟划分总是在同一端进行。
        若设待排序的记录序列{R1,R2,…,Rn}为R[1…n],则对其按关键值的非递减序列进行快速排序的算法如下:
        
        可见,快速排序可能会破坏两个相等记录的原来次序,因而快速排序算法是不稳定的。
 
        排序
        假设含n个记录的文件内容为{R1R2,…,Rn},其相应的关键字为{k1k2,…,kn}。经过排序确定一种排列{Rj1Rj2,…,Rjn},使得它们的关键字满足如下递增(或递减)关系:kj1≤kj2≤…≤kjn(或kj1kj2≥…≥kjn)。



更多复习资料
请登录电脑版软考在线 www.rkpass.cn

京B2-20210865 | 京ICP备2020040059号-5
京公网安备 11010502032051号 | 营业执照
 Copyright ©2000-2025 All Rights Reserved
软考在线版权所有