经典排序算法——冒泡排序
1 冒泡排序的实现
冒泡排序是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,指导没有反序的记录为止。
冒泡排序算法:,
void BubbliSort(SqList *L){
int i,j;
Status flag= TRUE;
for (i=1;i<L->length && flag;i++){ // 如果flag发生数据交换,则退出循环
flag = FALSE;
for(j=L->length-1;j>=i;j--){ // j从后往前循环
if(L->r[j]>L->r[j+1]){ // 若前者大于后者
swap(L,j,j+1); // 交换L->r[j]与L->r[j+1]的值
flag = TRUE; // 如果有数据交换,则flag为TRUE
}
}
}
/* 交换L中数组r的下标为i和j的值 */
void swap(SqList *L,int i,int j)
{
int temp=L->r[i];
L->r[i]=L->r[j];
L->r[j]=temp;
}
2 冒泡排序的算法步骤
- 设待排序的记录存在在数组r[1····n]中,首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序
(L->r[j]>L->r[j+1])
,则交换两个记录。然后比较第二个记录和第三个记录的关键字。依次类推,直到第n-1个记录和第n个记录的关键字进行过比较为止,上述过程称为冒泡排序的第一个趟,其结果是使得关键字最大的记录被安置到最后一个记录的位置上。 - 然后进行第二趟冒泡排序,对前n-1个记录进行同样操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。
- 重复上述比较和交换过程,第i趟是从
L-r[1]
到L->r[L->length-i+1]
依次比较相邻两个记录的关键字,并在“逆序”时交换相邻记录,其结果是这L->length-i+1
个记录中关键字最大的记录被交换到第L->length-i+1
的位置上。指导在某一趟排序过程中没有进行过交换记录的操作,说明序列已全部达到排序要求,则完成排序。
若待排序记录的关键字序列为{49,38,65,97,76,13,27,49}
,请给出用冒泡排序法进行排序的过程。
时间复杂度:,总的时间复杂度