No bb . Show me the code
1. 简单实现
public static long sort(int[] intArr) {
int arrLen = intArr.length;
long recycleNum = 0;
if (0 == arrLen) {
return recycleNum;
}
for (int i = 0; i < arrLen; i++) {
for (int j = 0; j < arrLen - 1; j++) {
recycleNum++;
// 左边是大(不是正常的排序顺序)的做交换
if (intArr[j] > intArr[j + 1]) {
int temp = intArr[j];
intArr[j] = intArr[j + 1];
intArr[j + 1] = temp;
}
}
}
return recycleNum;
}
考虑优化
2. 优化
/**
* 冒泡排序-优化版本,节约有序的
*
* @param intArr
*/
public static long sortPlus(int[] intArr) {
// 第一轮,永远是找到最大的
// 第二轮,找到的是第二大的,所以右边 n 个永远是有序的
// 如果有一种特殊情况,右边经过对比,发现不需要交换了,那就是后面的都是最大的。 有一个不是前面对比最大的,就会发生交换
// 加一个标记位,不发生交换的位置,就是比较的end
// 这样 原则上 1,2,3,4,5,6,7,8 只需要比较一轮
int arrLen = intArr.length;
long recycleNum = 0;
if (0 == arrLen) {
return recycleNum;
}
boolean isSorted = true;
for (int i = 0; i < arrLen; i++) {
for (int j = 0; j < arrLen - 1; j++) {
recycleNum++;
// 左边是大(不是正常的排序顺序)的做交换
if (intArr[j] > intArr[j + 1]) {
int temp = intArr[j];
intArr[j] = intArr[j + 1];
intArr[j + 1] = temp;
// 发生了交换
isSorted = false;
}
}
// TODO mark 是不是 j 都遍历一遍 只是增加了 判断。 反而增加了逻辑判断
if (isSorted) {
break;
}
}
return recycleNum;
}
3. 有序区
/**
* 冒泡排序-有序区
*
* @param intArr
*/
public static long sortOrdered(int[] intArr) {
int arrLen = intArr.length;
int lastExchangeIndex = arrLen;
int sortLen = arrLen - 1;
long recycleNum = 0;
if (0 == arrLen) {
return recycleNum;
}
boolean isSorted = true;
for (int i = 0; i < arrLen; i++) {
for (int j = 0; j < sortLen; j++) {
recycleNum++;
// 左边是大(不是正常的排序顺序)的做交换
if (intArr[j] > intArr[j + 1]) {
int temp = intArr[j];
intArr[j] = intArr[j + 1];
intArr[j + 1] = temp;
// 发生了交换
isSorted = false;
// 排序后的位置一定是有序的期间
lastExchangeIndex = j;
}
}
// 节约空间,如果已经有序,不对比那么多,缩短长度
// 为了不影响 j 循环,循环结束后引入新的变量
sortLen = lastExchangeIndex;
if (isSorted) {
break;
}
}
return recycleNum;
}
4. 测试代码
/**
* 循环次数,测试性能
*/
private static final int NUM = 1;
public static void main(String[] args) {
//获取开始时间
long startTime = System.currentTimeMillis();
for (int i = 0; i < NUM; i++) {
int[] intArr = new int[]{3, 4, 2, 1, 5, 6, 7, 8, 11};
// 72
// long recycleNum = sort(intArr);
// 72
long recycleNum = sortPlus(intArr);
// 11
// long recycleNum = sortOrdered(intArr);
System.out.println("循环次数:" + recycleNum);
// System.out.println(Arrays.toString(intArr));
}
// 获取结束时间
long endTime = System.currentTimeMillis();
System.out.println("程序运行时间: " + (endTime - startTime) + "ms");
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。