经典排序算法——冒泡排序

108 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

经典排序算法——冒泡排序

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 冒泡排序的算法步骤

  1. 设待排序的记录存在在数组r[1····n]中,首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序(L->r[j]>L->r[j+1]),则交换两个记录。然后比较第二个记录和第三个记录的关键字。依次类推,直到第n-1个记录和第n个记录的关键字进行过比较为止,上述过程称为冒泡排序的第一个趟,其结果是使得关键字最大的记录被安置到最后一个记录的位置上。
  2. 然后进行第二趟冒泡排序,对前n-1个记录进行同样操作,其结果是使关键字次大的记录被安置到第n-1个记录的位置上。
  3. 重复上述比较和交换过程,第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},请给出用冒泡排序法进行排序的过程。

image-20220922001028964.png

时间复杂度:n(n1)2\frac{n(n-1)}{2},总的时间复杂度O(n2)O(n^2)