冒泡排序的改进
上次提到的冒泡排序代码来进行简单的分析;
public static void bubbleSort(int[] arr){
if(arr==null || arr.length == 1){
return;
}
for(int i = 0;i<arr.length-1;i++){
for (int j = i+1;j<arr.length;j++){
if(arr[i] > arr[j])
swap(arr,i,j);
}
}
}
如果我们想要排序的序列为{9,1,5,8,3,7,4,6,2}。当i=1时,9与1交换之后,后面的元素均比1大,所以不会发生交换行为,即数列为{1,9,5,8,3,7,4,6,2},当i=2时,首先9与5互换{1,5,9,8,3,7,4,6,2},之后寻找比5小的元素,下一个到3,{1,3,9,8,5,7,4,6,2},再次寻找比3小的元素,{1,2,9,8,5,7,4,6,3},第二次循环结束。开始第三次循环,显而易见,下一个较小的元素即为3,而第二次循环我们却把3交换到了最后一个元素。从这个简单的例子我们可以看出,这个算法的效率确实有点低。我们是从小索引开始比较,从而把可能较小的元素换到了最后,那我们为什么不反过来思考,而从最后的索引开始比较,这样是不是就能把较小的元素换到比较靠前的位置?有这个想法,来简单实现。
public static void bubbleSort(int[] arr){
if(arr==null || arr.length < 2 ){
return;
}
for(int i = 0;i<arr.length;i++){
for (int j=arr.length-1;j>i;j--){
if(arr[j] < arr[j-1])
swap(arr,j,j-1);
}
}
}
我们从最后索引开始逐次两个比较,假设还是之前的数列{9,1,5,8,3,7,4,6,2},首先6大于2,6与2互换,下次比较,4大于2,4与2互换,依次比较得到{1,9,2,5,8,3,7,4,6},可以看到2从最后一个位置提到了第三个位置,再进行循环的时候,我们又可以对3的位置进行提升,这样就解决了之前的冒泡的效率低的问题。