冒泡排序是新手小白学的第一个排序方法,复杂度很高。那么如何在冒泡排序的基础上对其进行优化?
我们给一组数据:9,5,6,7,5,3
第一次冒泡:9和5交换位置(5,9,6,7,5,3);9和6交换位置(5,6,9,7,5,3);9和7交换位置(5,6,7,9,5,3);9和5交换位置(5,6,7,5,9,3);9和3交换位置(5,6,7,5,3,9)。到此9已经排好了,一个比较了5次。
第二次冒泡(初始数据为5,6,7,5,3,9):5没有6大,所有5和6不用交换;6和7比较也不用交换;7和5交换位置(5,6,5,7,3,9);7和3交换位置(5,6,5,3,7,9)。由于9是所有数比下来的一个结果,所以7和9没有比较的必要,到此7也排好了,一个比了4次。
第三次冒泡(初始数据5,6,5,3,7,9):5没有6大,所以5和6不用交换位置,6和第二个5比较后交换位置(5,5,6,3,7,9);6和3交换位置(5,5,3,6,7,9)。根据第二次处理后面数字的原理我们也不用比较6,7,9的大小,所以到此6就排好了,一共比较了三次。
第四次冒泡(初始数据为5,5,3,6,7,9):5和5不用换,第二个5和三交换(5,3,5,6,7,9)。一共比了两次。
第五次冒泡就排好了。
这是正常情况下的冒泡,我们一直要冒泡5次,但如果第一次冒泡后数组就有序了,我们就可以不用做剩下的几次冒泡。也就是说如果在某一次数字全部交换完毕后数组有序了,那么下次一定不会交换数据,这时我们就可以退出冒泡。
代码实现:
public static void sort(int[] array){
int temp = 0;
boolean flag = false;
//五个数据比四次
//每次都比上次少比一次
for(int i = 1;i < array.length;i++){
flag = false;
for(int j = 0;j < array.length - i;j++){
if(array[j] > array[j+1]){
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = true;
}
}
if(flag == false){
return;
}
}
}