常用的排序算法详解(C#版)

来源:互联网 发布:vpn 软件合法 编辑:程序博客网 时间:2024/05/16 06:14

只要是搞编程的算法、数据结构、操作系统、计算机组成原理这些东西都会有用到,就像医生给人治病一样,只有了解了人的内部机理、运作机制,才能很好的做到对症下药,药到病除。而上面所说的那些计算机理论课就好像人的内部机理一样,我们往往都把这些东西给忽略了,而把更多的精力放在具体的编程语言实现上,当然我也是这样,上学的时候这些计算机理论课都没怎么好好学,觉得这些东西很枯燥无味,最重要的是在我那时期的那个层次跟本看不到这些东西有什么用,学了很长时间的编程语言然后再回来看,发现只有对这些基础理论性的东西有更深刻的体会,才能做出更高效、更优秀的项目。

数据结构和算法一直都学得不好,总是当时看了理解的挺好,时间一长就有些忘了,而且这个东西在实际的开发中虽然有用但较之于编程的实现而言毕竟用的少些,熟能生巧吧,学习就是这样,不断的练习、总结,然后升华、提高,成为自己的东西。下面就把常用的几种算法总结分析下和大家分享,希望能对你们有所帮助。如果有说的不对的地方,还请朋友们多多指教!

一、冒泡排序算法

冒泡排序算法,就像它的名字一样生动形象,这个算法需要内外循环两次,外循环是控制整体的排序次数,外排次数=数组长度-1,关于这个也很好理解,比如10个数只要其他的9个位置确定了最后一个位置也就确定了,所以外排序的次数就是数组总个数减去1.内排序主要是控制每次的排序比较,之所以称之为冒泡就是因为每次排序的开始都是从数组的最后一位依次跟前一位比,就像气泡从水底冒出来一样,所以称之为冒泡排序

下面的具体算法实现:

Private static void MaoPao()

{

Int [ ] shuJu=new int [int]{ 12,43,2,34,87,54,32,16,67,49};

For(int i=1;i<=shuJu.Length-1;i++)

{

   For(int j=shuJu.Length;j>=i;j--)

    {

      If(shuJu[j]<shuJu[j-1])

        {

         Int temp=shuJu[j];

         shuJu[j]=shuJu[j-1];

         shuJu[j-1]=temp;

        }

   }

}

二、选择排序

选择排序的原理,第一次从数组中选出最小的数,将它放在数组的第一位置,第二次再从数组中选出最小的数,将它放置在第二个位置,以后每次都选出最小的数,按照上边的排序方式,放置在数组中合适的位置,这样到最后选出的数就是有序的。

具体代码实现:

Private void static XuanZe()

{

Int [ ] shuJu=new int [int]{ 12,43,2,34,87,54,32,16,67,49};

Int  min,temp;//分别用来标记最小的数组中最小数的下表,和存储临时数据(数字交换时使用)

For(int i=0;i<shuJu.Length-1;i++)

{

     Min=i;//标记下表为(当前的排序次数-1)的数组数字为当前的最小值

     For(int j=i+1;j<shuJu.Length;j++)//依次和数组中的其他数据进行比较,如果其他数据有比当前标记的最小值小的,则数组最小值下表赋值为两者之间较小值的下标

     {

       If(shuJu[j]<shuJu[min])

        {

           Min=j;

        }

        Temp=shuJu[i];

        shuJu[i]=shuJu[min];

        shuJu[min]=temp;

     }

}

三、插入排序

插入排序的原理是:每次向数组中插入一个数,将插入的数与之前插入的有序的数进行比较,如果大于之前插入的数,则直接插入,如果小于之前插入的数,则进行交换后再插入,这样到最后插入的数全部都是有序的。

具体代码实现:

Private static void ChaRu()

{

Int [ ] shuJu=new int [int]{ 12,43,2,34,87,54,32,16,67,49};

Int temp;

For(int i=1;i<shuJu.Length;i++)

{

   Int t=shuJu[i];//标记为排序的数据

   Int j=i;

While(j>0 && shuJu[j-1]>t) 如果当前未排数据小于上一个数据,且当前j大于0,则将上一个数据移致当前的数据所在的下标位置,同时j下标要减一,

{

   shuJu[j]=shuJu[j-1];

   j--;

}

shuJu[j]=t;

}    

}

四、快速排序算法

快速排序算法的原理是:主要用到了“分治”的思想,先将数组中找到任意一个数为基准分成两部分,一般是用数组的中间元素,并且使左边部分的数字全部小于基准数字,右边的部分全部大于基准数字,然后在递归调用快速排序分别对左右区间进行排序,这样形成的数组就是有序的了。分治思想就是将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。

具体代码实现:

private static void KaiSu(int[] shuJu,int left,int right)

        {

              shuJu=new int [int]{ 12,43,2,34,87,54,32,16,67,49};

            int a=left-1;//左区域

            int b=right+1;//右区域

            int mid = shuJu[(left + right) / 2];//基准数字

            if (left < right)

            {

                while (true)

                {

                    while (shuJu[++a] <mid)

                        ;

                    while (shuJu[--b] > mid)

                        ;

                    if (a >= b)

                    {

                        break;

                    }

                    int temp = shuJu[a];

                    shuJu[a] = shuJu[b];

                    shuJu[b] = temp;

                }

                KaiSu(shuJu, left, a );//再递归调用对左区域进行排序

                KaiSu(shuJu, b, right);//递归调用对右区域进行排序

        }

嗯,到这里常用的四种排序都介绍完了,各种排序有各的好处,冒泡排序比较容易理解,但是少量的数据还行,数据量大的话效率会很低,选择排序则是对冒泡排序的一个升级,插入排序的话也比较容易理解,效率也比冒泡排序高些,快速排序的效率很高,同时因为用到了递归函数调用对内存的开销会比较大一些,但整体来讲效率还是要比其他几种排序高的。

当然还有其他的一些排序,比如归并排序、堆排序、基数排序等,这些都不太容易理解,有兴趣的朋友可以去了解下!

 

原创粉丝点击