排序算法感想1

先来分析一下o(n*n)的算法:

第一种:插入排序:

插入排序的时候可以一边比较一边交换。顺便运用了冒泡的思想。

代码:

For(i=1;i<=n;i++)

         For(j=I;j>0;j--)

{

If(array[j]>array[j-1])

         Swap(array[j],array[j-1]);

}

         优化算法:

         先找i的位置,找的时候就把那些需要往后面移动的就移动了,这个时候是一次赋值操作,所以比较快。

         再一步优化:

的时候可以用二分查找那个I的位置。

二分查找代码:

         While(left<=right)

         {

                   Middle=(left+right)/2;

                   If(temp<array[middle])//保证排序是稳定的。  

                            Right=middle-1;

                   Else

                            Right=middle+1;

         }

         Left就是那个位置、

         冒泡排序:

         代码:

         For(i=1;i<n;i++)

                   For(j=n-I;j>=I;j--)

                   {

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

                                     Swap(array[j],array[j-1]);

                   }

         改进算法:可以设置一个标志位看什么时候没有交换的时候就可以退出了。

         直接选择排序:

         它是不稳定的,因为它一旦就是调换过后,被调换的元素就具有了不稳定性。

         代码:

         Int small;

         For(i=0;i<n-1;i++)

         {

                   Small=I;

                   For(j=i+1;j<n;j++)

                            If(array[j]<small)

                                     Small=j;

                   Swap(array[small],array[i]);

         }

         Shell排序:

         产生原因:针对直接插入排序在有序的时候时间复杂度可以精简为o(n)。对于短序列,插入排序也比较有序。

         代码:

         For(delta=n/2;delta>0;delta/=2)   //确定间隔

                   For(i=delta;i<n;i++)                                      

{

                            For(j=i;j>=0;j-=delta)    

                                     If(a[j]<a[j-delta])

                                                        Swap(a[j],a[j-delta]);

                   }

posted @ 2011-06-07 20:38  gui__li  阅读(205)  评论(0编辑  收藏  举报