复习一下排序的知识,今天写冒泡排序。
冒泡排序的原理:遍历该数组,比较相邻两个值,如果a[j] > a[j+1],那么交换两个值,即将大的值放到后面,向一个水泡一样冒出去。
public void sort(int[] array) {
// 外层循环,控制比较到哪截止
for (int i = 0; i < array.length; i++) {
// 内层循环,控制那两项进行比较
for (int j = 0; j < array.length - i - 1; j++) {
// Sort type: asc
// if (array[j] > array[j + 1]) {
// this.swap(array, j, j + 1);
// }
//Sort type: desc
if (array[j] < array[j + 1]) {
this.swap(array, j, j + 1);
}
}
}
}
冒泡排序的性能:比较次数--O(n*n),交换次数O(n*n).
网上看到有针对冒泡排序的改进:
1. 如果第一遍冒泡的时候没有任何数据的交换,则说明该数组已经是有序的,则退出排序
2. 记录下上一次冒泡排序的交换位置,下一次从 0 到 该点进行内层循环比较 而不是 0 到 a.length-i-1.
自己做了一下测试2:
public void sortWithControl(int[] array) {
int last_swap_index = array.length - 1;
// 外层循环,控制比较到哪截止
for (int i = 0; i < array.length; i++) {
int temp = last_swap_index ;
// 内层循环,控制那两项进行比较
for (int j = 0; j < temp; j++) {
// Sort type: asc
if (array[j] > array[j + 1]) {
swap(array, j, j + 1);
last_swap_index = j;
}
}
}
}
每次试验都是做了计算了10次排序所需时间总和
数组个数-----------------普通sort-------------------改进后sort
10000 4313 4265
4046 4266
4079 4297
4232 4236
4203 4296
5000 1282 1311
1172 1204
1188 1220
1061 1376
1187 1094
1000 140 157
94 265
...
我没看出有什么改善来,或者我写的改进程序有bug?

4567

被折叠的 条评论
为什么被折叠?



