冒泡排序
-
在八大排序中,冒泡排序是最为出名的排序算法之一!
-
冒泡排序的代码还是相当简单的,两层循环,外层是冒泡轮数,里层是依次进行的比较交换;
-
时间复杂度为O(n^2);
-
冒泡排序的基本思想:
- 比较数组中相邻的两个元素,如果第一个数比第二个数大(从小到大排序就把大数值放到后面,从大到小相反),就交换它们的位置;
- 每一次比较都会产生一个最大或最小的数组值;
- 下一次循环就排除 2 步骤得到的最大或最小值,只排序剩下的元素,再得到一个新的最大或最小值;
- 依次循环 1、2、3 步骤,直到所有元素排序完成;
-
图解:
-
通过实例理解(这里用的Java代码):
//自定义的排序方法(冒泡排序的代码位置),从小到大排序
public static void sort(int[] arr) {
//外层循环,根据待排序数组长度判断要循环的次数;
for(int i=0;i<arr.length;i++){
//内层循环,把每个相邻的元素比较一遍,如果前面数大就会和后面相邻的交换,这样一直到数组最后一个元素,就会得到一个最大值;
/*为什么 j<arr.length-1-i :
1. 首先是j<arr.length-1:因为比较的时候 j 和 j+1 比较,如果 j 等于数组长度也就是最后一个元素,那么 j+1 就超出了数组的长度,无法取到 j+1 的值,这会引起程序报错,所以内层循环的 j 要小于(数组长度-1),写 j<arr.length-1 也可以,因为后面排序好的再比较也不会交换;
2. 然后是j<arr.length-1-i:因为外层每次循环都会得到一个最大或最小值,所以每次循环都会有一个最大或最小数不用参加下一次循环,(arr.length-1)-i 之后数组长度就会减去外层循环次数,相当于把排序好的数剔除;
*/
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
int a = arr[j];
arr[j]=arr[j+1];
arr[j+1]=a;
}
}
}
}