思路就是,重的下沉,轻的上浮。
(1)n个数需要n-1躺排序
(2)每趟排序中,对待排序的相邻数两两进行比较,重的下沉。第一趟有n个数待排序,需要比较n-1次;第二趟有n-1个数待排序,需要n-2次比较;…;第n-1躺只有两个数待排序,需要1次比较。
// 朴素冒泡排序
void bubbleSort(int *arr, int length)
{
// length个数需要lenght-1次冒泡过程完成排序
for(int i=1; i<length; i++)
{
// 每趟对待排序的相邻数进行比较
for(int j=1; j<length-i+1; j++)
{
// 重的下沉
if(arr[j-1] > arr[j])
{
int temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
}
}
}
}
时间复杂度O(n2)O(n^2)O(n2),空间复杂度O(1)O(1)O(1)。
改进:使用标志变量记录排序状态。
若序列已经有序,则一趟比较完后,不会发生数的交换。因此,当某躺排序未发生数的交换时,则说明数据已有序,及时结束排序。
// 改进的冒泡排序
void bubbleSort(int *arr, int length)
{
// length个数需要lenght-1次冒泡过程完成排序
for(int i=1; i<length; i++)
{
int flag = 1;
// 每趟对待排序的相邻数进行比较
for(int j=1; j<length-i+1; j++)
{
// 重的下沉
if(arr[j-1] > arr[j])
{
int temp = arr[j-1];
arr[j-1] = arr[j];
arr[j] = temp;
flag = 0;
}
}
// 若某趟没有发生交换,则已排好
if(flag) return;
}
}
本文讲解了朴素冒泡排序的基本原理,并提出一种改进方法,通过添加标志变量判断排序是否已完成,显著提升排序效率。时间复杂度降至O(n^2),空间复杂度保持在O(1)。核心在于理解重的下沉和优化比较次数。
2万+

被折叠的 条评论
为什么被折叠?



