冒泡排序
冒泡排序的基本思想是:
对相邻的元素进行两两比较,顺序相反则进行交换。
这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序
#include<cstdio> #include<algorithm> using namespace std; int a[120000],n; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",&a[i]); for(int i=1;i<=n;++i) { bool fg=1; //设定一个标记,若为true,则表示此次循环没有进行交换, //也就是待排序列已经有序,排序已然完成。 for(int j=1;j<n;++j) if(a[j]>a[j+1]) { swap(a[j],a[j+1]); fg=0; } if(fg) break; } for(int i=1;i<=n;++i) printf("%d ",a[i]); return 0; }
根据上面这种冒泡实现,若原数组本身就是有序的(这是最好情况),仅需n-1次比较就可完成。
若是倒序,比较次数为 n-1+n-2+...+1=n(n-1)/2,交换次数和比较次数等值。
所以,其时间复杂度依然为O(n2)