冒泡排序:
-
冒泡排序是简单经典的排序算法,它重复地走访过要排序地元素,一次比较相邻地两个元素,如果他们的顺序错误就把他们调换过来,知道没有元素再需要交换,排序完成。名字由来:元素经由交换慢慢“浮”到数列顶端
-
冒泡排序算法:
1.比较相邻的元素,如果前一个比后一个大,就把他们两个调换位置
2.对每一对相邻元素作同样的哦你工作,从开始第一对到结尾的最后一对。这步做完之后,最后的元素会是最大的数
3.针对所有的元素重复以上步骤,除了最后一个
4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
5.优点:
每进行一趟排序,就会少比较一次,因为每进行一趟排序就会找出一个较大值。如上例:第一趟比较之后,排在最后的一个数一定是最大的一个数,第二趟排序的时候,只需要比较除了最后一个数以外的其他的数,同样也能找出一个最大的数排在参与第二趟比较的数后面,第三趟比较的时候,只需要比较除了最后两个数以外的其他的数,以此类推……也就是说,没进行一趟比较,每一趟少比较一次,一定程度上减少了算法的量。
实例过程:
3 5 2 6 2
第一轮:
比较3 和5 ,5>3,不要进行交换
3 5 2 6 2
继续比较5 和 2,5>2,交换位置
3 2 5 6 2
继续比较5 和 6, 6>5,不需交换
3 2 5 6 2
继续比较6 和2,6>2,不需要交换
3 2 5 2 6
6 下沉到最后,两个2 都分别向上(前)冒出
第二轮:
比较3 和2 ,3>2,交换位置
2 3 5 2 6
比较3 和 5 ,5>3,不需要交换
2 3 5 2 6
比较5 和 2,5>2,需要交换
2 3 2 5 6
不需要比较5 和6
第三轮:
比较2 和 3,3>2,不需要交换
2 3 2 5 6
比较 3 和 2,3>2,需要交换位置
2 2 3 5 6
不需要比较了
第四轮:
比较2 和 2 ,不需要交换
其他也不需要比较了
2 2 3 5 6
四轮结束
代码实现:
public class Practice5 {
public static void main(String[] args) {
int[] arrays = {3,5,2,6,2};
int[] sorted = sort(arrays);
System.out.println("最终结果");
for (int i : sorted){
System.out.println(i + " ");
}
}
public static int[] sort(int[] array){
int temp;
int[] arrays = {3,5,2,6,2};
//第一层循环表明比较的轮数,比较length-1次
for (int i=0;i<arrays.length-1;i++){
System.out.println("第" +(i+1) + "轮开始");
//第二层循环,相邻的两个比较,次数随着论述的增加不断减少,每轮确定出一个最大的
for (int j =0;j<arrays.length-1-i;j++){
if (arrays[j+1]<arrays[j]){
temp=arrays[j];
arrays[j]=arrays[j+1];
arrays[j+1]=temp;
}
System.out.println("第" +(i+1) + "轮,第" +(j+1) +"次比较: ");
for (int k :arrays){
System.out.println(k+" ");
}
System.out.println();
}
System.out.println("结果: ");
for (int k :arrays){
System.out.println(k + " ");
}
System.out.println();
}
return arrays;
}
}
输出结果:
第1轮开始
第1轮,第1次比较:
3
5
2
6
2
第1轮,第2次比较:
3
2
5
6
2
第1轮,第3次比较:
3
2
5
6
2
第1轮,第4次比较:
3
2
5
2
6
结果:
3
2
5
2
6
第2轮开始
第2轮,第1次比较:
2
3
5
2
6
第2轮,第2次比较:
2
3
5
2
6
第2轮,第3次比较:
2
3
2
5
6
结果:
2
3
2
5
6
第3轮开始
第3轮,第1次比较:
2
3
2
5
6
第3轮,第2次比较:
2
2
3
5
6
结果:
2
2
3
5
6
第4轮开始
第4轮,第1次比较:
2
2
3
5
6
结果:
2
2
3
5
6
最终结果
2
2
3
5
6
代码二:(简洁)
int[] intArrayNum = {3,10,50,60,90};
/*
* {3,10,30,50,26}/
* {3,10,30,26}//去点50
* {3,10,26,30}
* {3,10,26}//去掉30
* {3,10}
* */
for (int i =0;i<intArrayNum.length-1;i++){
for (int j = 0;j<intArrayNum.length-i-1;j++){
if (intArrayNum[j+1] < intArrayNum[j]){
int tmp = intArrayNum[j];
intArrayNum[j] = intArrayNum[j+1];
intArrayNum[j+1] = tmp;
}
}
}
System.out.println(Arrays.toString(intArrayNum));