9.2 交换排序
交换排序的基本思想是对数据表中两个数据元素的关键字进行比较,如果发生逆序(即排列顺序与排序后的次序正好相反),则两者交换位置,直到所有数据元素都排好序为止。
冒泡排序
- 冒泡排序(bubble sort) 的算法思想是:设数据表elem中有n个数据元素,首先对数据表中第一、二个数据元素(elem[0]和 clem[1])进行比较,如果 elem[0]>eicm[1],则交换 elcm[0]和 elem[1];然后对第二、三个数据元素做同样处理;重复此过程,直到处理完最后两个相邻的数据元素。称此过程为一趟冒泡,它将关键字最大的数据元素移到数据表的最后一个位置。其他数据元素一般也都向排序的最终位置移动。然后进行第二趟排序,对数据表中前n-1个元素进行与上述同样的操作,其结果使整个数据表中关键字次大的数据元素被移到elem[n-2]的位置。如此最多进行n-1趟冒泡就能把所有数据元素排好序。
- 对于冒泡排序,当数据元素的初始排列已经按关键字从小到大排好序时,此算法只执行一趟冒泡,进行了n-1次关键字比较,不移动数据元素,这是最好的情形;最坏的情形是数据元素的初始排列按关键字从大到小排列(逆序),此时算法执行n-1趟冒泡,第i趟(1<=i<n)做了n-i次关键字比较。执行了n-i次数据元素交换。这样在最坏情形下总的关键字比较次数和数据元素移动次数分别为:
- 在最坏情况下。冒泡排序的时间复杂度为O(n2)。冒泡排序需要一个附加存储空间以实现数据元素的交换。显然,冒泡排序算法是一种稳定的排序方法。
- 算法实现
//顺序表的冒泡排序
template<class ElemType> void BubbleSort(ElemType elem[],int n)
{
bool finish=false;
int i=1;
while(i<n && !finish)
{
finish=true;
for(int j=0; j<n-i; j++)
if(elem[j]>elem[j+1])
{
//swap(elem[j],elem[j+1])
ElemType tmp=elem[j+1];
elem[j+1]=elem[j];
elem[j]=tmp;
finish=false;
}
i++;
}
}
//双向链表的冒泡排序
template<class ElemType> void DbLinkList<ElemType>::BubbleSort()
{
DblNode<ElemType> *q=NULL,*r=NULL,*last;
last=NULL;
while(head->next!=last)
{
q=head->next;
while(q->next!=last)
{
if(q