排序概述
1、排序
排序就是将一组对象按照规定的次序重新排列的过程,排序往往是为检索服务的。
2、稳定性
n 个记录的序列为{R1,R2,…,Rn},其相应的键值序列为{k1, k2,…,kn},假设ki=kj,若在排序前的序列中 Ri 在 Rj 之前,即 i<j,经过排序后,Ri 仍在 Rj 之前,则称所用的排序方法是稳定的;反之,则称所用的排序方法是不稳定的。
(若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是稳定的。)
注意: 稳定性是排序方法本身的特性,与数据无关,换句话说,一种排序方法如果是稳定的,则对所有的数据序列都是稳定的,反过来,如果在一组数据上出现不稳定的现象,则该方法是不稳定的。
3、分类
内部排序(Internal Sorting):待排序的记录全部存放在计算机内存中进行的排序过程;
外部排序(External Sorting):待排序的记录数量很大,内存不能存储全部记录, 需要对外存进行访问的排序过程。
冒泡排序
1、概念
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
2、算法
在算法实现时,定义一个整型变量 endsort,在每一次排序之前,先将它置为 0,若在一趟起泡中交换了记录,则将它置为 1。当一次循环结束时,我们再检查 endsort,若 endsort 的值为 0 便终止算法。
201910考试真题
void BubbleSort (List R, int n) {
int i,j,temp,endsort;
for(i=0; i<n-1; i++) {
endsort=0;
for (j=0; j<n-i-1; j++) {
if (R[j].key>R[j+1].key) //若逆序则交换记录
{
temp=R[j];
R[j]=R[j+1];
R[j+1]=temp;
endsort=1;
}
}
if (endsort==0) break;
}
}
3、图解动态演示
4、时间复杂度、稳定性
该算法的平均时间复杂度为 O(n^2),如果已经有序则比较次数为 n-1,时间复杂度则为 O(n)。
冒泡排序是稳定的排序方法。