基本原理
冒泡排序是一种交换排序,基本思想是将前一个数与后一个数进行比较,将较大的数放到后面,接着将第二个数和后一个数比较,这样将每次找到的大数放在后面,形成一个有序数列
例如:
第一次:9,1,5,8,3 //交换 9 1
第二次:1,9,5,8,3 //交换 9 5
第三次:1,5,9,8,3 //交换 9 8
第四次:1,5,8,9,3 //交换 9 3
第五次:1,5,8,3,9//第一次找出来最大的数 9
第六次:1,5,8,3,9 //不交换
第七次:1,5,8,3,9 //交换 8 3
第八次:1,5,3,8,9//第二次找出来第二大的数 8
第九次:1,5,3,8,9 //交换 5 3
第十次:1,3,5,8,9//第三次找出来第三大的数 5
//第一个数和第二个数已经比较过了
实现方法
双重循环
void maopao(int *arr,int n)
{
if(n < 2)
{
return ;
}
/*int i,j,temp;
for(i = n-1;i > 0;i--)
{
for(j = 0;j < i;j++)
{
if(arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}*/
int i,j,temp;
for(i = 0;i < n-1;i++)
{
for(j = 0;j < n-i-1;j++)
{
if(arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
递归法
void maopao(int *arr,int n)
{
if(n < 2)
{
return ;
}
int i ,temp;
for(i = 0;i < n-1;i++)
{
if(arr[i] > arr[i+1])
{
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
maopao(arr, --n);
}
冒泡排序优化
因为在排序的过程中会1产生一些不必要的多余步骤设置一个标志位可以避免这些不必要的步骤
void maopao(int *arr,int n)
{
if(n < 2)
{
return ;
}
int i,j,temp,swap;
for(i = 0;i < n-1;i++)
{
for(j = 0;j < n-i-1;j++)
{
if(arr[j] > arr[j+1])
{
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
swap = 1;
}
}
if(swap == 0)
{return ;}
}
}
冒泡排序的时间复杂度
排序个数:n
执行次数:T(n) = n(n-1)/2
因此时间复杂度为:O(n²)