武汉软件工程职业学院《数据结构讲义》第22讲-内部排序(2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
武汉软件工程职业学院《数据结构讲义》第22讲-内部排序(2)
教学重点:
交换排序算法和选择排序的算法
教学难点:
交换排序算法和选择排序的算法的设计 授课内容
6.2.2 交换排序
1.冒泡排序
冒泡排序(Bubble sort)是一种人们熟悉的、最直观的交换排序方法。在排序过程中,从上到下对每两个相邻记录比较关键字大小,使较小关键字的记录上升,像水中的气泡向上冒出一样,而关键
字较大的记录好比石头沉到序列的底部,故称此方法为冒泡排序法。
算法思路:若有n个记录需要排序,首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即r[2].key<r[1].key),则两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直至第n个记录和第n-1个记录的关键字进行比较/交换为止。
void BubbleSort (RcdType r[ ],int n){
for(i=1;j<n;i++){
flag=1;
for(j=1;j<=n-i;j++)
if(r[j+1].key<r[j].key){
flag=0;
r[0]=r[j];r[j]=r[j+1];r[j+1]=r[0];
}
if(flag) break;
}
}
2.快速排序
快速排序(Quick sort)是由霍尔(Hoare)提出,它是一种对冒泡排序的改进。该方法的实质是
将一组关键字[K
1 ,K
2
,K
3
,…,Kn]进行分区交换排
序。通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行分区交换排序,以达到整个序列有序。
算法思路是:
(1)任选一个关键字(一般可先第一记录的关
键字K
1)为控制字,将[K
1
,K
2
,…,Kn]分成
左、右两个子区,使左区所有关键字小于
等于K
1,右区所有关键字大于等于K
1
,最后
控制字K
1
居两个子区中间的适当位置。在子区内数据尚处于无序状态。
(2)将右区首、尾指针[记录的下标号]保存入栈,对左区进行与第(1)步相类似的操作,
又得到它的左子区和右子区,控制字居中。(1)重复第(1)、(2)步,直到左区处理完毕。然后退栈,再对另一个子区进行相类
同的处理,直到栈空。
void Quick_Sort(RcdType r[ ],int low,int
high){
i=low;j=high;t=r[low];
while(i<j){
while(i<j&&r[j].key>t..key) j--;
if(i<j) r[i++]=r[j];
while(i<j&&r[i].key<=t.key) i++;
if(i<j) r[j--]=r[i];
}
if(low<i-1) Quick_Sort(r,low,i-1);
if(high>i-1) Quick_Sort(r,i+1,high);
}
6.2.3 选择排序
选择排序(Selection sort)是以选择为基础的一种常用排序方法,它也有几种不同的实现方法,这里仅介绍单选择排序和堆排序。
1.简单选择排序
简单选择排序(simple Selection sort)也称直接选择排序。此方法在高级语言变成中较常用。它首先选出关键字最小的饿记录送到最前位置,再选关键字次小的记录送到第二个位置,……,直至
选择完了n个记录为止。
算法思路:对于一组关键字(K
1 ,K
2
,… ,Kn),
将其由大到小进行排序,首先从K
1 ,K
2
,… ,Kn中
选择最小值,假如它是Kk,则将Kk与K
1
对换;然后
从K
2 ,K
3
,… ,Kn中选择最小值Kk,再将Kk与K
2
对换。如此进行选择和调换,对第i趟选择排序,进行n-1次关键字比较,从n-i+1个记录中选出关键字最小的记录,并个第i(1≤i≤n)个记录交换。令i从1至n-1,进行n-1趟选择排序,一个由小到大的有序序列就形成。
void SelectSort(TcdType r[ ],int n){
for(i=1;i<n;j++)
if(r[j].key<r[k].key) k=j;
if(i!k){
t=r[i];r[i]=r[k];r[k]=t;
}
}
}
2.堆排序
堆排序(Heap sort)是另一种选择排序,是利用堆的特性进行的排序过程。堆是n 个元素的
有限序列{k
1,k
2
,…,kn},当且仅当满足如下关
系时,称之为堆。
ki≤k2i和ki≤k2i+1(i=1,2,…,[n/2])
或ki≥k2i和ki≥k2i+1(i=1,2,…,[n/2])
堆排序的基本思路是:把n 个记录存于向量r