主要内容:
1、冒泡排序
2、冒泡排序实现1
3、冒泡排序实现2
4、冒泡排序实现3
一、冒泡排序的原理
冒泡排序是简单的一种排序方法,效率低下,复杂度为O(n^2),其具体的算法流程如下:
1、算法需要对数组遍历n-1遍;
2、在每一次遍历中,比较前后相邻元素的大小,如果第一个比第二个大,则交换他们,这样第一次遍历之后数组最后一个值就是最大值;
3、依次重复上面的步骤,就可以得到升序排序的数组。
复杂度分析:
最差时间复杂度(数组从大到小,交换次数):(n-1)+(n-2)+……+1=n*(n-1)/2=O(n^2)
最好时间复杂度(数组从小到大,交换次数):0
二、冒泡排序的实现1
如上述原理:
// naive bubbleSort void bubbleSort1(int a[],int n){ int tmp; for(int i=1;i<=n-1;i++){ for(int j=0;j<n-i;j++){ if(a[j]>a[j+1]){ tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; } } } }
三、冒泡排序的实现2
设置一个标识,如果在某一趟遍历中没有发生交换,说明排序已经完成,即算法完成。
// set flag to indicate which step to stop void bubbleSort2(int a[],int n){ int tmp; bool change=true; for(int i=1;i<=n-1 && change;i++){ change=false; for(int j=0;j<n-i;j++){ if(a[j]>a[j+1]){ tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; change=true; } } } }
四、冒泡排序的实现3
如果数组有100个数,仅前面10个无序,后面90个有序,那么第一趟遍历后,最后发生交换的位置必定小于10,记录下这个位置,第二次遍历只需要从数组头部遍历到这个位置即可。
// set flag to indicate what next step should begin from void bubbleSort3(int a[],int n){ int tmp; bool change=true; int flag=n-1; int k; for(int i=1;i<=n-1 && change;i++){ change=false; k=flag; for(int j=0;j<k;j++){ if(a[j]>a[j+1]){ tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp; change=true; flag=j; } } } }