【算法初级】排序 - “Bubble Sort”优化

来源:互联网 发布:用友软件操作流程 编辑:程序博客网 时间:2024/06/06 18:50

       前些天写了一个比较“冒泡”和“直接选择”的博客,主要是从形式上对其进行对比(都套有两层for循环),但是从本质上来说,前者属于“交换排序”,而后者属于“选择排序”,还是不一样的。

       鉴于这几天遨游在知识的海洋中,我发现了一些基本算法的优化策略,小菜介绍下对“冒泡”的两点优化。

       算法原型:

//核心冒泡算法 - Bubblefor (int i = 0; i < arry.Length - 1; i++){for (int j = 0; j < arry.Length - i - 1; j++){if (arry[j] < arry[j + 1]){temp = arry[j];arry[j] = arry[j + 1];arry[j + 1] = temp;}}}
      

           可以得知:外层for循环每走一趟,内层for循环会遍历交换相邻的数组元素,对于乱序的一列数组,这个方法很棒,但是应对与特殊情况,例如:

       1、数列本身有序

       2、数列从某个位置后有序

       这个时候,再套用这个“double for循环”就有些浪费内存了,于是乎,就要优化了。


       Condition 1:数列本身有序

       思路:在内层for循环外加一个bool标识,如果内层某一趟循环未进行相邻位置交换,则改变该bool标识值。

       代码:

void BubbleSort(int a[], int n)  {          //定义bool标识,在外层循环中赋初值,每一趟外层循环监听该bool值       bool flag;         for (int i = 0; i < arry.Length - 1; i++)       {           flag = false;           for (int j = 0; j < arry.Length - i - 1; j++)           {               if (arry[j] < arry[j + 1])               {                   temp = arry[j];                   arry[j] = arry[j + 1];                   arry[j + 1] = temp;                   flag = true;               }           }       }}
         这样,只要发现了某一趟没有进行相邻交换,则证明该数列排序满足要求。


      Condition2: 数列仅前X位无序,后面的有序

      思路:如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一趟遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。

      代码:

void BubbleSort2(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;              }      }  } 
        区别于上面的写法,定义一个int值而非bool值,用于记录索引从多少开始,后面值将不再改变,从而缩小循环遍历范围。


        总结:这个月不忙,组长建议我平时学习下算法,每天下班前能学个1~2小时,可能是为了提高我敲的代码的逻辑性吧,总而言之,这些东西都是程序员的内功,建议朋友们也学习学习,对于编程思维很有锻炼意义。


   

       



1 0