冒泡排序
冒泡排序算法图形化模拟
原数组:6 7 5 4 2 1
冒泡排序算法:
核心算法:
public static void bubble(int [] arr){
// 模拟冒泡排序
// 1. 0 ~ N - 1 选出最大
// 2. 0 ~ N - 2 选出最大...
// n - 1. 0 ~ 1 选出最大
if (arr.length == 1){
return;
}
for (int i = arr.length - 1; i > 0; i--){ // 控制 0 ~ N -1 ~ N - 2...
for (int j = 0; j < i; j++){
if (arr[j] > arr[j + 1]) {
swap(arr,j, j + 1);
}
}
}
}
swap算法
// 交换两数
public static void swap(int[] arr,int i, int j){
// 利用异或运算的性质:
// 1. a ^ a = 0;
// 2. 0 ^ a = a;
// 3. a ^ b = b ^ a;
// 4. a ^ b ^ c = a ^ (b ^ c)
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
// 上述即可完成交换两数,但是该方法是一个抖机灵的方法
// 要确保,a与b所在的内存地址是不同的,如果内存地址相同,结果会变为0
}
上述就是完整的详细图解冒泡排序算法,还有很多优化的空间,比如当我们给出一组已经排好序的数据,或者有一大部分数据已经有序了,还可以进行优化。可以给出一个标志位flag,如果进入了交换算法,那么表示需要进行排序,如果自始至终都没有进入交换算法,那么表示这个数据已经有序了,就不需要n次判断了,可以在外层循环,添加break。直接结束该循环。
比如给出的数据如下:[1,2,3,4,5,6,7,8,9]
[1,3,6,7,8,9,10,11,12]
这种类似的数据,可以试着优化一下,作者也是正在学习,如有不正确,欢迎大家斧正。