排序算法之冒泡排序:一种优化的冒泡排序算法

       我们知道,对于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;
			}
	}
}


 

以上有什么问题,愿意同行共同探讨,本人虚心求教!
      

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值