冒泡排序的速度很慢,运行效率差,我们有更好的排序方式,我将会在下面贴上代码。
除了冒泡排序还有其他两种更好更快的排序方式:
list.sort(Comparator.comparingInt(a -> a));
list = list.parallelStream().sorted(Comparator.comparingInt(a -> a)).collect(Collectors.toList());
首先我们来回忆一下冒泡排序的写法:
// 冒泡排序
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size() - i - 1; j++) {
if(list.get(j) > list.get(j +1)){
int temp = list.get(j);
// j是下标,list.get(j+1)是数值,相当于list[j] = list[j+1];
// 把j的下标赋值给j+1
list.set(j,list.get(j+1));
list.set(j+1,temp);
}
}
}
然后我们来写一段代码,看一下冒泡排序所用的时间:
public class Bubble {
public static void main(String[] args) {
// 设置数组内存容量
List<Integer> list = new ArrayList<>(10000);
Random random = new Random();
for (int i = 0; i < 10000; i++) {
int num = random.nextInt(10000000);
list.add(num);
}
// 输出随机数中第一个和最后一个的数值
System.out.println("第一个:" + list.get(0));
System.out.println("最后一个:" + list.get(list.size() - 1));
System.out.println("--------------开始排序计时--------------");
// 时间,毫秒级,开始的时间
long start = System.currentTimeMillis();
// 冒泡排序
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size() - i - 1; j++) {
if(list.get(j) > list.get(j +1)){
int temp = list.get(j);
// j是下标,list.get(j+1)是数值,相当于list[j] = list[j+1];
// 把j的下标赋值给j+1
list.set(j,list.get(j+1));
list.set(j+1,temp);
}
}
}
// 结束的时间
long end = System.currentTimeMillis();
System.out.println("-------结束-------\n用了" + (end - start) + "毫秒");
}
}
这是输出的结果:
第一个:3341164
最后一个:304705
--------------开始排序计时--------------
-------结束-------
用了570毫秒
现在我们换一种排序方式:
public class Bubble {
public static void main(String[] args) {
// 设置数组内存容量
List<Integer> list = new ArrayList<>(10000);
Random random = new Random();
for (int i = 0; i < 10000; i++) {
int num = random.nextInt(10000000);
list.add(num);
}
// 输出随机数中第一个和最后一个的数值
System.out.println("第一个:" + list.get(0));
System.out.println("最后一个:" + list.get(list.size() - 1));
System.out.println("--------------开始排序计时--------------");
// 时间,毫秒级,开始的时间
long start = System.currentTimeMillis();
// 一种排序方式,比冒泡排序快很多
list.sort(Comparator.comparingInt(a -> a));
// 结束的时间
long end = System.currentTimeMillis();
System.out.println("-------结束-------\n用了" + (end - start) + "毫秒");
// 排序之后的数值第一个和最后一个
System.out.println("第一个:" + list.get(0));
System.out.println("最后一个:" + list.get(list.size() - 1));
}
}
输出的结果:
第一个:3758097
最后一个:3634525
--------------开始排序计时--------------
-------结束-------
用了70毫秒
第一个:378
最后一个:9998349
再试一下另一种排序方式:
public class Bubble {
public static void main(String[] args) {
// 设置数组内存容量
List<Integer> list = new ArrayList<>(10000);
Random random = new Random();
for (int i = 0; i < 10000; i++) {
int num = random.nextInt(10000000);
list.add(num);
}
// 输出随机数中第一个和最后一个的数值
System.out.println("第一个:" + list.get(0));
System.out.println("最后一个:" + list.get(list.size() - 1));
System.out.println("--------------开始排序计时--------------");
// 时间,毫秒级,开始的时间
long start = System.currentTimeMillis();
// 一种排序方法,贼拉快,比冒泡快近百倍
list = list.parallelStream().sorted(Comparator.comparingInt(a -> a)).collect(Collectors.toList());
// 结束的时间
long end = System.currentTimeMillis();
System.out.println("-------结束-------\n用了" + (end - start) + "毫秒");
// 排序之后的数值第一个和最后一个
System.out.println("第一个:" + list.get(0));
System.out.println("最后一个:" + list.get(list.size() - 1));
}
}
输出的结果有些奇怪,我第一次运行的时候只用9毫秒,使我大为震惊,今天却变成了80毫秒。算了,知道有这种排序方式就行了。
第一个:8442779
最后一个:3652149
--------------开始排序计时--------------
-------结束-------
用了80毫秒
第一个:770
最后一个:9998553