冒泡
方法
每次将当前子数组的最后一位置于子数组最后一位,递归执行
步骤
从数组第一个数开始,每次与它后一个数比较
如果符合前小后大,那么下标移到下一位
如果不符合前小后大,那么交换俩数,使得符合前小后大,然后下标移到下一位
下一位是数组最后一个数时结束这一趟排序
每一趟排序后最后一个数必为最大,故现在排前n-1个数就好了,即边界-1;
例子
初始数组:
1,5,3,2,4
冒泡排序第一趟:
i=0开始
1:
1,3,5,2,4
i=2;
2:
1,3,2,5,4
i=3;
3:
1,3,2,4,5
i=4;
(1、2、3指改变数组的样子的顺序)
好,第一趟已经结束,数组中最大的数位置已经放对了,所以这次数组需要排序部分右边界-1,然后重复上述步骤,直到数组左边界等于右边界。
代码
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
typedef int ElementType;
using namespace std;
long *arr;
int N;
void Bubble_Sort()
{
for(int i=N;i>0;i--)
{
bool f=0;//
for(int j=0;j<i-1;j++)
{
if(arr[j]<=arr[j+1])
{
continue;
}
else
{
swap(arr[j],arr[j+1]);
f=1;
}
}
// if(!f)
// {
// break;//若已经有序,则退出循环不再比较
// }
}
}
int main()
{
cin>>N;
arr=(long *)malloc(sizeof(long)*N);
for(int i=0;i<N;i++)
{
cin>>arr[i];
}
Bubble_Sort();
for(int i=0;i<N;i++)
{
cout<<arr[i]<<" ";
}
system("pause");
return 0;
}
运行结果:
总结
其实,仔细去想,对于相同的数组,冒泡和插入的操作次数总是相等,这算是巧合吗?
当然不是,而是因为它们每次操作都只会消除一个逆序对(相关视频),所以要想提高算法效率,就得一次操作消除多个逆序对