对冒泡算法的改进

本文介绍了一种优化冒泡排序的方法,通过减少不必要的遍历来提高排序效率。针对已排序数组及部分排序数组的情况进行了讨论,并提供了具体的实现代码。
 
对一组无序的数字进行排序,冒泡方法是我们常用的一种方法。它的主要思想是对相临的两个数字进行比较然后选较大(小)的一个起来,另一个沉下去。对N个数字,我们需要进行N-1趟,但是有时候我们根本不需要对每一组数字从头到尾都进行遍历,我们指需对那部分无序的地方排列即可完成任务,这样可以提高算法的质量。
 
1
 对于一个本来就有序的数组,我门只遍历一边,就可以判断出它是有序的,然后结束任务。
 
for (i = 0; i < 9 && tag ; i++) //tag 这里做一个标志,判断它是否已经有序了
   {
          tag = 0;
       for ( j = 0; j < 10 - i - 1; j++)
          {
                 if (a[j] > a[j+1])
                 {
                        temp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = temp;
                     tag = 1;
                 }
          }
   }
 
2
 对一组数据前部分有序后部分无序算法
for(i = 0; i <= 8 && k >= 0 ; i++)
          {
                 k = -1;
          for(j = k+1; j <= 10-i-1 ; j++ )
          {
                 if(a[j] > a[j+1])
                 {
                        temp = a[j];
                        a[j] = a[j+1];
                        a[j+1] = temp;
                
                        if (k == -1)
                        {
                           k = j + 1;
                      
                        }
 
                 } 
          }
 
 主要思想:
 我们主要是找到第一个交换的地点然后以这个点为起点对它后面的数字排序即可。
 
3 对一组数据前无序后有序
while(k1 >= 0)
   {
          k2 = k1;
          k1 = -1;
 
          for (i = 0; i < k2 ; i++)
          {
                 if (a[i] > a[i+1])
                 {
                        temp = a[i];
                        a[i] = a[i+1];
                        a[i+1] = temp;
                        k1 = i;
                 }
          }
 
   }
主要思想:我们找到最后一次交换的点,以该点作为终点,然后从O到该点进行排序。
 
但对于前无序中间有序后无序的情况,没进一步考虑,呵。
 
 
如果有那里不足,希望大家给个意见,谢谢。
 
 
有时间在签
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值