目录
一、基本思想
冒泡排序是交换排序中一种简单的排序方法。它的基本思想是对所有相邻记录的关键字值进行比效,如果是逆序则将其交换,最终达到有序化。其处理过程为:
对序列从后向前依次将相邻记录的关键字进行比较,若逆序(arr[j]<arr[j-1])则将其交换,从而使得关键字值小的记录向上"飘浮"(左移),关键字值大的记录好像石块,向下“堕落”(右移)。 即:
每经过一趟冒泡排序,都使原序列中关键字值最大的记录进入有序区,对于由n个记录组成的记录序列,最多经过n-1趟冒泡排序,就可以将这n个记录重新按关键字顺序排列。
二、过程示意图
三、代码实现过程
/**
* 冒泡排序
*/
void bubbleSort(int arr[],int len){
int i,j,temp,c1=0,c2=0;
for(i=0;i<len-1;i++){//i是比较次数
for(j=len-1;j>i;j--){//这里是从后往前比,实际从前到后都可以
c1++;
/*如果前面的大,则交换位置,把小的放前面,直到找出最小的放在最前面*/
if(arr[j]<arr[j-1]){
temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
c2++;
}
}
}
System.out.println("比较"+c1+"次,"+"移动"+c2+"次");
}
四、算法改进
用flag变量标记是否发生交换,如果没有交换则说明已经排好序了,就不用在继续比较了,此时flag=flase,结束循环,通过比较没有改进和改进后的c1和c2,会发现改进后的效率高。
/**
* 冒泡排序改进
*/
void bubbleSort2(int arr[],int len){
int i,j,temp,c1=0,c2=0;
boolean flag=true;
for(i=0;i<len-1 && flag;i++){
flag=false;
for(j=len-1;j>i;j--){
c1++;
if(arr[j]<arr[j-1]){
c2++;
temp=arr[j-1];
arr[j-1]=arr[j];
arr[j]=temp;
flag=true;
}
}
}
System.out.println("比较"+c1+"次,"+"移动"+c2+"次");
}
五、复杂度
空间上只用了一个辅助单元,时间上最好的情况是已经有序了,这样就不用交换,只在第一趟比较n-1次。最坏的情况就是刚好逆序,比如我要1,2,3,4但是序列是4,3,2,1。。。这样的话就要排n-1趟了,第1趟要交换n-1次,第i趟交换n-i次。所以:
总次数=1/2n(n-1)
所以复杂度=O()
上面说的是未改进的,接着说改进后的
有些序列可能是3,42,4,66,67,68,这样66,67,68就不用再比较了啊,已经有序了,所以改进后减少了代码执行次数,提高了效率。但是
复杂度依然=O(),hhh。。 因为虽然比n-1趟少,但还是用n表示,比较次数也是n表示。当序列非常大的时候应该能体现出来区别。
-----------------------------------我是分割线----------------------------------------------
...........emmm自己作图花的时间好多啊,我决定
下次一定不自己作图了()