测试一下几个排序算法的实际性能,相同的10万个随机数的排序,冒泡要14s,交换要2.7s,直插只要800ms。
同样时间复杂度的算法,怎么跑起来差这么多。
debug看了,每一趟冒泡过程也很正常。
下面是冒泡排序的代码。
@Slf4j
public class BubbleSort {
@Test
public void test() {
int[] arr = new int[]{8, 6, 18, 5, 4, 11, 1, 9, 2, 3, 7, 15};
log.info("init: {}", Arrays.toString(arr));
bubbleSort(arr);
log.info("result: {}", Arrays.toString(arr));
}
public void bubbleSort(int[] arr) {
if (arr == null)
return;
for (int i = 0; i < arr.length - 1; i++) {
boolean flag = true;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
// 3次亦或还不如直接拷贝
// arr[j] = arr[j] ^ arr[j + 1];
// arr[j + 1] = arr[j] ^ arr[j + 1];
// arr[j] = arr[j] ^ arr[j + 1];
flag = false;
}
}
// log.debug("i={}, arr: {}", i, Arrays.toString(arr));
if (flag) // 已经有序
break;
}
}
}
下面是运行代码中的简单测试用例,并打印的结果
00:50:47.782 [main] INFO cn.line.sort.BubbleSort - init: [8, 6, 18, 5, 4, 11, 1, 9, 2, 3, 7, 15], len=12
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=1, arr: [6, 8, 5, 4, 11, 1, 9, 2, 3, 7, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=2, arr: [6, 5, 4, 8, 1, 9, 2, 3, 7, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=3, arr: [5, 4, 6, 1, 8, 2, 3, 7, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=4, arr: [4, 5, 1, 6, 2, 3, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=5, arr: [4, 1, 5, 2, 3, 6, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=6, arr: [1, 4, 2, 3, 5, 6, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=7, arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 18]
00:50:47.785 [main] DEBUG cn.line.sort.BubbleSort - i=8, arr: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 18]
00:50:47.786 [main] INFO cn.line.sort.BubbleSort - result: [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 15, 18]
结果看起来挺正常的,每次把当前未排序部分最大的数,冒泡到数组的末端。
调试、打印,看看网友的代码。
是冒泡就是这么慢,还是我代码有问题?
有没有一个参考数据?
冒泡排序就是比较慢的,冒泡排序数组元素交换的次数比较多,比其它排序方式慢是正常的
你不要每次都取arr.length的值,用变量保存arr.length的值,循环中用变量来控制循环次数
另外把变量声明都放在循环外比较好
int len = arr.length,i,j,tmp;
boolean flag;
for (i = 0; i < len - 1; i++) {
flag = true;
for (j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
// 3次亦或还不如直接拷贝
// arr[j] = arr[j] ^ arr[j + 1];
// arr[j + 1] = arr[j] ^ arr[j + 1];
// arr[j] = arr[j] ^ arr[j + 1];
flag = false;
}
}
// log.debug("i={}, arr: {}", i, Arrays.toString(arr));
if (flag) // 已经有序
break;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
你这4毫秒就排完了,还嫌慢,你想要多快呢