冒泡排序作为最基本最简单的排序算法,应用了基础的交换排序,代码如下
void bubble_sort(int*arr,int n)
{
for(int i = 0;i<n;i++)
for(int j = i+1;j<n;j++)
{
if(arr[j] > arr[i])
{
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
如上,冒泡排序虽然简单,但是会浪费更多的时间,那如何稍微降低一下冒泡排序的复杂度呢?
先上代码
void bubble_sort(int* A,int n)
{
int i=0;
bool exchanged;
do{ exchanged = false; //标志
for (int j = n - 1; j>=i+1;j--)
if (A[j] < A[j-1])
{
swap(A[j],A[j-1]);
exchanged=true;
}
i++;
}while (i<=n-1 && exchanged == true );
}
我们可以设置一个标志记为exchanged,首先标记为false
i 记为大循环的标记,j 记为小循环的标记。
在每一次小循环中,可以从后往前比较,然后如果满足交换条件,就实行交换,然后将标记改为true,这样为大循环的条件做铺垫。
而大循环的条件首先要满足遍历的次数,其次就是满足我们设置的标记是真,否则不满足排序,就中断排序。
给个例子:
int main()
{
const int n = 10;
int a[n];
for(int i = 0;i < n;i++)
a[i] = i*i-9*i+5;
for(int i = 0;i < n;i++)
cout<<a[i]<<" ";
cout<<endl;
bubble_sort(a,n);
for(int i = 0;i < n;i++)
cout<<a[i]<<" ";
}
我描述一下第一次的大循环。
首先从数组尾开始比较,直到第四第五位才满足for()的比较,然后进行交换,此时的数组为:
5 -3 -9 -15 -13 -15 -13 -9 -3 5
然后继续遍历,此时的j应该指在了第四位,然后继续满足交换,此时的数组为:
5 -3 -15 -9 -13 -15 -13 -9 -3 5
同上,继续交换,此时的数组为:
5 -15 -3 -9 -13 -15 -13 -9 -3 5
最后进行比较交换,第一次小循环完成时的数组为:
-15 5 -3 -9 -13 -15 -13 -9 -3 5
所以-15被冒泡上来了。
此次的改动虽然不会改变算法的时间复杂度,但是会在小方面提高减少的时间,也就是用空间换时间。