冒泡排序介绍
冒泡排序,使用2层循环,一边比较,一边把大的移动的下一位,这样每次循环最后一个都是当前最大的。
优化写法,如果循环内没有做一次交换,则没有剩下的就是已经排好序的,无需再继续比较。进一步优化的方法是,如果记录没有交换的下标,下次比较的时候只进行到下标位置。
时间复杂度O($n^{2}$),空间复杂度O(1)。
1 2 3 4 5 6 7 8 9
| private void bubble(int[] arr) { for (int i = 0; i < arr.length - 1; i++) { for (int j = 0; j < arr.length - 1 - i; j++) { if (arr[j] < arr[j + 1]) { swap(arr, j, j + 1); } } } }
|
交换
最常见的交换方法是开辟临时区域交换。
1 2 3
| int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;
|
还有一种方式,通过先加后减或先减后加的方式,不用新内存即可实现,但这种方式有可能因为int越界导致异常。
1 2 3 4 5 6 7 8 9
| arr[j + 1] = arr[j + 1] + arr[j]; arr[j] = arr[j + 1] - arr[j]; arr[j + 1] = arr[j + 1] - arr[j];
arr[j + 1] = arr[j] - arr[j + 1]; arr[j] = arr[j] - arr[j + 1]; arr[j + 1] = arr[j + 1] + arr[j];
|
最好的交换方式是使用位运算。
1 2 3
| arr[i] = arr[i] ^ arr[j]; arr[j] = arr[j] ^ arr[i]; arr[i] = arr[i] ^ arr[j];
|