官方首页
 计算机科学与技术
 湖畔文学
 星之传说
 蓝色湖畔桃园
 湖畔艺术
 湖畔科技
 本站留言
热门关键字:    dreamlandcn.com    蓝色湖畔
 >>相关文章
·.NET 4特性聚焦:并行编程
·Java之路(3)--写好你程
·Java之路(2)--写好你程
·什么样的软件公司具有持久生命力
·在SSH架构中出现异常时
·JVM怎么清理栈中的引用
·美国金融风暴席卷全球 又见IT
·Baidu收录是否限制Alim
·“网游大盗”成为2008年十大
·阿里巴巴投3000万美元全球推
 >>点击排行TOP10
·多种排序算法,多种语言讲解(前言)
·多种排序算法,多种语言讲解(简单选
·多种排序算法,多种语言讲解(冒泡排
·多种排序算法,多种语言讲解(堆排序
·多种排序算法,多种语言讲解(快速排
·【其它欣赏】少儿不宜的设计
·多种排序算法,多种语言讲解(树形选
·多种排序算法,多种语言讲解(交换排
·多种排序算法,多种语言讲解(希尔排
·如何使用EasyRecovery找
·多种排序算法,多种语言讲解(总结)
·多种排序算法,多种语言讲解(直接插
·多种排序算法,多种语言讲解(归并排
·c#网络应用编程基础 第5章 Wi
·VC中使用GetModuleFil
 
 当前位置:网站首页 > 计算机科学与技术 > 算法 > 浏览正文
多种排序算法,多种语言讲解(双向冒泡排序)
作者:佚名    来源:本站原创    点击数:   更新时间:2008年06月21 【字体:
 

本文作者:思念天灵,QQ: 47913857,网站:www.dreamlandcn.com

欢迎来访询问与讨论,本文有错的地方,愿能各位谅解并给予批评指出。

如果引用本文内容请注明出处,谢谢。

通常的冒泡是单向的,而这里是双向的,也就是说还要进行反向的工作。 代码看起来复杂,仔细理一下就明白了,是一个来回震荡的方式。写这段代码的作者认为这样可以在冒泡的基础上减少一些交换(我不这么认为,也许我错了)。

排序方式如下:

原始数组:    22    53   72   11   34   44   11   15   28   3    10   65

第一次交换:  22    53   72   11   34   44   11   15   3    28   10   65

第二次交换:  22    53   72   11   34   44   11   3    15   28   10   65

第三次交换:  22    53   72   11   34   44   3    11   15   28   10   65

第四次交换:  22    53   72   11   34   3    44   11   15   28   10   65

第五次交换:  22    53   72   11   3    34   44   11   15   28   10   65

第六次交换:  22    53   72   3    11   34   44   11   15   28   10   65

第七次交换:  22    53   3    72   11   34   44   11   15   28   10   65

第八次交换:  22    3    53   72   11   34   44   11   15   28   10   65

第九次交换:   3    22   53   72   11   34   44   11   15   28   10   65

第一趟排序:   3    22   53   72   11   34   44   11   15   28   10   65

第十次交换:   3    22   53   11   72   34   44   11   15   28   10   65

第十一次交换: 3    22   53   11   34   72   44   11   15   28   10   65

第十二次交换: 3    22   53   11   34   44   72   11   15   28   10   65

第十三次交换: 3    22   53   11   34   44   11   72   15   28   10   65

第十四次交换: 3    22   53   11   34   44   11   15   72   28   10   65

第十五次交换: 3    22   53   11   34   44   11   15   28   72   10   65

第十六次交换: 3    22   53   11   34   44   11   15   28   10   72   65

第十七次交换: 3    22   53   11   34   44   11   15   28   10   65   72

第二趟排序:   3    22   53   11   34   44   11   15   28   10   65   72

第十八次交换: 3    22   53   11   34   44   11   15   10   28   65   72

第十九次交换: 3    22   53   11   34   44   11   10   15   28   65   72

第二十次交换: 3    22   53   11   34   44   10   11   15   28   65   72

……

第三趟排序:   3    10   22   53   11   34   44   11   15   28   65   72

……

最后趟排序:   3    10   11   11   15   22   28   34   44   53   65   72

反正我认为这是一段有趣的代码,值得一看。

(VB)

#Region "双向冒泡"

    ''' <summary>

    ''' 双向冒泡排序,Powered By 思念天灵

    ''' </summary>

    ''' <param name="mData">待排序的数</param>

    ''' <returns>返回排好序的数组</returns>

    ''' <remarks></remarks>

    Function Bubble2Sort(ByVal mData As Integer()) As Integer()

        Dim iTemp, i As Integer

        Dim left As Integer = 1

        Dim right As Integer = mData.Length - 1

        Dim t As Integer = 0

        Do

            ''正向的部分

            For i = right To left Step -1

                If mData(i) < mData(i - 1) Then

                    iTemp = mData(i)

                    mData(i) = mData(i - 1)

                    mData(i - 1) = iTemp

                    t = i

                End If

            Next

            left = t + 1

 

            ''反向的部分

            For i = left To right Step 1

                If mData(i) < mData(i - 1) Then

                    iTemp = mData(i)

                    mData(i) = mData(i - 1)

                    mData(i - 1) = iTemp

                    t = i

 

                End If

            Next

            right = t - 1

        Loop While left <= right

        Return mData

    End Function

#End Region

(C#)

        #region "双向冒泡排序"

        /// <summary>

        /// 双向冒泡排序

        /// </summary>

        /// <param name="mData">输入的数组</param>

        /// <returns>已排好序的数组</returns>

        public int[] Bubble2Sor(int[] mData)

        {

            int iTemp, i;

            int left = 1;

            int right = mData.Length - 1;

            int t = 0;

            do

            {

                //正向的部分

                for (i = right; i >= left; i--)

                {

                    if (mData[i] < mData[i - 1])

                    {

                        iTemp = mData[i];

                        mData[i] = mData[i - 1];

                        mData[i - 1] = iTemp;

                        t = i;

                    }

                }

                left = t + 1;

 

                //反向的部分

                for (i = left; i < right + 1; i++)

                {

                    if (mData[i] < mData[i - 1])

                    {

                        iTemp = mData[i];

                        mData[i] = mData[i - 1];

                        mData[i - 1] = iTemp;

                        t = i;

                    }

                }

                right = t - 1;

            } while (left <= right);

            return mData;

        }

        #endregion

(C++)

//双向冒泡排序,Powered By 思念天灵

void Bubble2Sort(int* pData,int Count)

{

     int iTemp;

     int left = 1;

     int right =Count -1;

     int t;

     do

     {

         //正向的部分

         for(int i=right;i>=left;i--)

     {

         if(pData[i]<pData[i-1])

         {

              iTemp = pData[i];

              pData[i] = pData[i-1];

              pData[i-1] = iTemp;

              t = i;

         }

     }

     left = t+1;

 

     //反向的部分

     for(i=left;i<right+1;i++)

     {

         if(pData[i]<pData[i-1])

         {

              iTemp = pData[i];

              pData[i] = pData[i-1];

              pData[i-1] = iTemp;

              t = i;

         }

     }

     right = t-1;

     }while(left<=right);

}

JavaScript)(仅限网页)

// 双向冒泡排序网页JS版,Powered By 思念天灵

function Bubble2Sort(mData)

{

         var iTemp;

         var left = 1;

         var right = mData.length - 1;

         var t;

         do

         {

                   //正向的部分

                   for(var i = right;i >= left;i--)

                   {

                            if(mData[i] < mData[i - 1])

                            {

                                     iTemp = mData[i];

                                     mData[i] = mData[i - 1];

                                      mData[i - 1] = iTemp;

                                     t = i;

                            }

                   }

                   left = t + 1;

 

                   //反向的部分

                   for(i = left; i < right + 1; i++)

                   {

                            if(pData[i] < mData[i - 1])

                            {

                                     iTemp = mData[i];

                                     mData[i] = mData[i - 1];

                                     mData[i - 1] = iTemp;

                                     t = i;

                            }

                  }

                   right = t - 1;

         }while(left <= right);

         Bubble2Sort = mData;

}

尽管,双向冒泡排序的算法时间复杂度仍为O(n^2),但较比普通单向冒泡排序的优点是更符合人的逻辑思想。但是真正使用起来没有太大的实际意义,无非是两次排序过程分开来写了而已。

Tags:dreamlandcn.com
Google
关于我们 | 服务指南 | 著作权与商标声明 | 法律声明 | 服务条款 | 隐私声明 | 诚征英才  | 友情链接
Powered by ACTCMS 2.0
Copyrights©2008-2009 蓝色湖畔 www.dreamlandcn.comAll Rights Reserved. 滇ICP备05000680号