思路就是,重的下沉,轻的上浮。
(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 ( n 2 ) 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;
}
}