冒泡排序
基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
下面是具体思路:
有一个数组 : int array [] = {5,4,3,2,1};
现在要求从小到大进行排序,那么我们可以想象排序过后 应该是 {1,2,3,4,5}
那么 冒泡排序 的原理就是 :
每比较一轮,就把最大的放到最后面,这也是冒泡名称的由来。
那么我们先做第一轮比较吧!
for (int i = 0; i < a.length - 1; i++){
if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
int temp = a[ i + 1];
a[i + 1] = a[ i ];
a[ i ] = temp;
}
}
来细分一下 这个比较的过程 :
i = 0 ,a[0] 和 a[1]比较,比较完以后,数组的顺序应该是 :4,5,3,2,1
i = 1 ,a[1] 和 a[2]比较,比较完以后,数组的顺序应该是 :4,3,5,2,1
i = 2 ,a[2] 和 a[3]比较,比较完以后,数组的顺序应该是 :4,3,2,5,1
i = 3 ,a[3] 和 a[4]比较,比较完以后,数组的顺序应该是 :4,3,2,1,5
当i=4的时候,由于要判断 i<a.length - 1,不满足,故退出比较。
所以第一轮比较完以后,数组的顺序应该是 {4,3,2,1,5}。
此时对比结果,还需要比较,那么到底需要比较几轮呢?几轮呢?轮呢?呢~~~~??
如果 “每次把最大的数字冒到最后去” 算一轮的话,那么在最极端情况下[比如本例],那么应该是n-1轮,那么又有同学问了,为什么是n-1轮呢?
那再举个例子,2个数字 {2,1}比较的话,把大的放后面去要几轮呢?1轮,也就是 2 - 1 轮,呵呵,推广一下就是 n - 1轮了。
所以 冒泡的代码应该是这个样子的 :
for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
for (int i = 0; i < a.length - 1; i++){
if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
int temp = a[ i + 1];
a[i + 1] = a[ i ];
a[ i ] = temp;
}
}
}
到这里冒泡其实已经结束了。
但是其实还有一个优化空间。
我们前面已经发现,
经过第一轮排序,最大的一个已经到最后一个位置了。
经过第二轮排序,次大的一个已经到倒数第二个位置了。
以此类推,所以每经过一轮排序,那么“对应的倒数位置”的数字其实已经不用对比了。
比如 经过第一轮排序,那么在进行第二轮排序的时候,倒数第一个其实已经不用对比了,因为再第一轮排序的时候,已经非常明确,最后一个就是最大的了。
所以这里就有一个优化的地方 :
for(int j = 0 ; j < a.length - 1; j++){ // a.length - 1 标示 n - 1轮
for (int i = 0; i < a.length - 1 - j; i++){//这里减去一个 " j" ,那么每次比较 “对应的倒数位置”的数字就不会对比了
if(a[ i ] > [a + i]){ //如果a[i] 比 a[i+1]大的话,二者就交换顺序
int temp = a[ i + 1];
a[i + 1] = a[ i ];
a[ i ] = temp;
}
}
}
到这里冒泡应该比较完整了,那么自己写的代码自己肯定要测试的啦。。
那么怎么测试呢 ?
我来写几个用例吧 ,直接写数组元素吧 :
// int[] a={};
// int[] a={0};
// int[] a={5,1,7};
// int[] a={3,5,1,7,4,6};
// int[] a={-7,99,34,8,0,-3};
// int[] a={1,2,3,4,5};
int[] a={5,4,3,2,1};
以上转载自 :http://www.cnblogs.com/woxiangbo/p/4624907.html
测试代码:
public class BubbleSort {
public void bubbleTest(int[] a){
for(int j=0;j<a.length-1;j++){
for(int i=0;i<a.length-1-j;i++){
if(a[i]>a[i+1]){
int temp=a[i+1];
a[i+1]=a[i];
a[i]=temp;
}
}
System.out.print("第" + (j + 1) + "次排序结果:");
for(int i = 0; i < a.length; i++){
System.out.print(a[i] +" ");
}
System.out.println("");
}
System.out.print("最后为:");
for(int i=0; i<a.length;i++)
System.out.print(a[i]+" ");
}
public static void main(String[] args) {
BubbleSort bs= new BubbleSort();
// int[] a={};
// int[] a={0};
// int[] a={5,1,7};
// int[] a={3,5,1,7,4,6};
// int[] a={-7,99,34,8,0,-3};
// int[] a={1,2,3,4,5};
int[] a={5,4,3,2,1};
bs.bubbleTest(a);
}
}