冒泡排序
原理
假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第二个数和第三个数比较,如果第二个数大,第二个数和第三个数交换位置,否则不动……第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第一轮循环结束,最大的数挪到了第十个数的位置,比较进行了9次。 (注意:第一轮循环结束后,第十个数的位置已经固定,它是这些数里的最大值,不再需要比较)
第二轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动……第八个数和第九个数比较,如果第八个数大,第八个数和第九个数交换位置,否则不动。第二轮循环结束,第二大的数挪到了第九个数的位置,比较进行了8次。
……
第九轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动。第九轮循环结束,倒数第二大的数挪到了第二个数的位置,比较进行了1次。
即:每次比较两个相邻的元素,将较大的元素交换至右端。
图解



Java实现
import java.util.Arrays;
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {
2,10,65,88,5,8,1};
BubbleSort b = new BubbleSort();
b.bubblesort(arr);
// BubbleSort.bubblesort(arr); // bubblesort方法 加 static
System.out.println(Arrays.toString(arr));
}
public void bubblesort(int[] arr){
int temp;
if(arr.length<=1){
return;
}
//控制冒泡次数
for(int i=0;i<arr.length-1;i++){
//控制冒泡的比较次数
//(可结合图理解 --冒泡次数每增加1,对应比较的次数相应减少1,体现在i上)
for(int j=0;j<arr.length-1-i;j++){
if(arr[j+1]<arr[j]){
//相邻元素两两对比,如果是逆序的,则进行元素交换
temp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=temp;
}
}
}
}
}
注意:为什么 j < arr.length-1-i
第一轮循环: 每次比较两个相邻的元素,将较大的元素交换至右端。
第二轮循环:比较和上一轮几乎一样,只不过比较次数比第一次少1次 (因为最右端已经是最大数,无需再比较)
第三轮循环:比较和上一轮几乎一样,只不过比较次数比第二次少1次
……
综上,每增加一轮循环,我们的比较次数减1。
因此,我们要复用内循环,而循环的轮数由 i < arr.length - 1 决定,那么,我们要使它每轮循环后对于比较次数进行递减,则,可以再嵌套循环,将条件改为 j < arr.length-1-i ;i 从零递增,那么第一次,内循环执行了 arr.length - 1-0次;第二次,内循环执行了 arr.length - 1-1……第九次执行了arr.length-1-8次(arr.length=10)
运行结果
冒泡之前的数组:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 88, 5, 8, 1]
开始冒泡:[2, 10, 65, 5, 88, 8, 1]
开始冒泡:[2, 10, 65, 5, 8, 88, 1]
开始冒泡:[2, 10, 65, 5, 8, 1, 88]
开始冒泡:[2, 10, 65, 5, 8, 1, 88]
开始冒泡:[2, 10, 65, 5, 8, 1, 88]
开始冒泡:[2, 10, 5, 65, 8, 1, 88]
开始冒泡:[2, 10, 5, 8, 65, 1, 88]
开始冒泡:[2, 10, 5, 8, 1, 65, 88]
开始冒泡:[2, 10, 5, 8, 1, 65, 88]
开始冒泡:[2, 5, 10, 8, 1, 65, 88]
开始冒泡:[2, 5, 8, 10, 1, 65, 88]
开始冒泡:[2, 5, 8, 1, 10, 65, 88]
开始冒泡:[2, 5, 8, 1, 10, 65, 88]
开始冒泡:[2, 5, 8, 1, 10, 65, 88]
开始冒泡:[2, 5, 1, 8, 10, 65, 88]
开始冒泡:[2, 5, 1, 8, 10, 65, 88]
开始冒泡:[2,

本文详细介绍了冒泡排序、快速排序和选择排序三种经典排序算法,通过图解和Java代码实现来阐述它们的原理。冒泡排序每次比较两个相邻元素并交换,快速排序采用基准数划分,选择排序则通过比较选取最小/大元素交换。快速排序在平均情况下具有较好的时间复杂度O(NlogN)。
&spm=1001.2101.3001.5002&articleId=102812056&d=1&t=3&u=cb6e09318eb14ebba7550b87ccfd04e6)

被折叠的 条评论
为什么被折叠?



