我们知道,对于N个数据的冒泡排序,无论原数据有无顺序,都需要进行比较N-1步的中间排序。这种排序方法的思路简单直观,缺点就是执行的步骤有点长,效率不是很高。
一种改进的方法,就是在每次中间排序之后,比较一下数据是否已经按照顺序排列完成。如果排列完成,则退出排序过程,否则继续进行冒泡排序。这样,对于数据比较有规则的,可以加速算法的执行过程。
下面给出该算法的java实现:
package sort.bubbleSort;
public class BubbleSort {
static final int SIZE =20;//用来设置数组大小
static void bubble(int[] a){//java中直接传递给函数一个数组,不需要传递数组的长度,
//因为可以通过a.length获取数组的长度。
int temp;
boolean flag;//用一个标记变量,用于标记中间排序数据是否有变化
for(int i=1;i<a.length;i++){
flag=true;
for(int j=0;j<a.length-i;j++){
if(a[j]>a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=false;
}
}
//给出每趟排序后的结果,便于对比分析
System.out.print("第"+i+"步查询的结果:");
for(int k=0;k<a.length;k++){
System.out.print(a[k]+" ");
}
System.out.println();
if(flag) return ;
}
}
public static void main(String[] args) {
int[] shuzu = new int[SIZE];
for(int i=0;i<shuzu.length;i++){
shuzu[i]=(int) (Math.random()*(100+1));
}
System.out.print("排序前数组:");
for(int i=0;i<shuzu.length;i++){
System.out.print(shuzu[i]+" ");
}
System.out.println();
bubble(shuzu);
System.out.print("排序后的数组:");
for(int i=0;i<shuzu.length;i++){
System.out.print(shuzu[i]+" ");
}
}
}
运行的结果:
我们可以看出,改进前的冒泡排序,对于20个数据需要N-1躺中间排序,改进后的排序方法有可能缩短了中间排序的过程。
到此为止,难道排序算法就已经最优了吗?当然不是,再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。
算法实现如何:
void BubbleSort3(int a[], int n)
{
int j, k;
int flag;
flag = n;
while (flag > 0)
{
k = flag;
flag = 0;
for (j = 1; j < k; j++)
if (a[j - 1] > a[j])
{
Swap(a[j - 1], a[j]);
flag = j;
}
}
}
以上有什么问题,愿意同行共同探讨,本人虚心求教!