冒泡排序算是我们接触到的第一个排序,因为它简单,当然了也是有公司面试会问的。
原理:依照次序不断地两个两个向后比较,比较相邻元素,我们拿整数数组为例,并且我们按照升序排列。每一趟将一个最大的元素放到最末尾,进行n-1次比较即可(此处需要说明一下,有时候有改进,就是搞一个标记,如果遍历一趟,没有进行任何交换,那么这个数组也就已经排好序了,不需要再继续排序,则停止。这个时候可能不是遍历n-1趟)。
步骤:1、j代表这一趟遍历需要最终放好的元素的位置,i代表遍历没有排好序的元素,两两相邻比较
2、j <— length-1..1, i <— 0..j-1
3、遍历,如果第i个元素大于第i+1个,则进行交换,否则继续
4、完成遍历,打印结果
分析:首先看时间复杂度,我们不考虑加标记这种情况,时间复杂度就是O(n^2),再看交换的时候我们是第i个大于第i+1才交换,所以它是稳定的,并且不需要其他存储,所以它是原地的。
代码展示:搞个JAVA写的代码看一下,当然,语言只是表述的方式,我们主要看思想和步骤。为了方便看每一趟排序的结果,我这里排完一趟我就打印一下整个数组。全部排完再打印一下。
public class BubbleSort {
public static void main(String[] args){
int[] array = {7, 11, 5, 8, 7, 2, 10, 1};
sort(array);//排序
System.out.print("排序结果:");
for(int k : array)
System.out.print(k + " ");
}
public static void sort(int[] target){
if(target.length<=1)//判断长度小于等于1就没必要排了
return;
int i=0,j=0;
for(j=target.length-1;j>=1;j--){//j可以看做是每趟最终要放好的元素的位置
for(i=0;i<j;i++){//遍历还没放好的元素
if(target[i]>target[i+1])
exchange(target,i,i+1);
}
System.out.print("第"+(target.length-j)+"趟:");
for(int num : target)
System.out.print(num + " ");
System.out.println();
}
}
public static void exchange(int[] target,int left,int right){
int tmp = target[left];
target[left] = target[right];
target[right] = tmp;
}
}
执行结果:
第1趟:7 5 8 7 2 10 1 11
第2趟:5 7 7 2 8 1 10 11
第3趟:5 7 2 7 1 8 10 11
第4趟:5 2 7 1 7 8 10 11
第5趟:2 5 1 7 7 8 10 11
第6趟:2 1 5 7 7 8 10 11
第7趟:1 2 5 7 7 8 10 11
排序结果:1 2 5 7 7 8 10 11
思想应该很清楚了吧。。当然,本人才疏学浅,描述有不当的地方,欢迎您指正,先在此谢过了~~