回忆排序

         有关排序的东西还是半年前看的,很多东西都忘了。所以今天拿出来再回忆一下。。

简单的排序方法有:冒泡排序,选择排序,插入排序。

其中冒泡排序算法最差,效率最低。算法基本思路是从树组的第1个元素开始,将它与其数组的其他元素进行比较,大的放在后面,这样每论下来能选出一个最大的,这样就进行了由小到大的排序。

选择排序不同于冒泡排序的是,它是从最左边开始,也就是将数组中小的元素先进行排序,而冒泡排序是先将大的元素进行了排序。思路是从第1元素(outer)开始,一个指针(inner)从第2个元素开始向后遍历找到最小的元素(min),然后将min放到第1个元素(outer),将outer放到min的位置,也就是将这两个元素进行一次swap。下一次outer和min将移到第2个元素,inner从第3个元素开始寻找min,找到了就swap,一直这么下去。。。这样数组的左边始终是有序的。选择排序比冒泡优越的地方在于两个元素的swap将少很多。

插入排序不同于冒泡排序的是,它将数组分成了左右的有序和无序的两个部分。步骤是:先设置一个标志元素(temp),然后从最左边开始,先把第2个元素作为(outer,inner),然后比较inner-1和temp的大小,如果temp小,则将inner-1 copy到inner中,temp再copy到inner-1中。第2次,outer/inner指向第3个元素,再将outer copy到temp,再比较inner-1与temp的大小如果inner-1小,就将temp copy到inner,后面的将不再做比较了,因为在左边inner-1已经是最大的了。如果inner-1比temp大,则将inner-1放到inner,inner向左移动一格,再比较inner-1和temp的大小,如果小于temp,就将temp copy到inner中。插入排序的好处在与只有元素间的copy没有swap,而copy比swap要快的多。所以插入排序一般速度是冒泡排序的两倍,也比选择排序要快。。。。

上面的3中简单的排序算法总的来说效率都慢。。。。O(N*N)。。。

下面再来说下mergeSort。mergeSort基本原理是将一个数组不停的从中间分成两个部分,一直分到只有一个元素为止,然后在把分开的两个数组合并为一个,合并的过程中实现了数族的有序。这个用递归来实现非常的方便。

下面是一个MergeSort的例子:

public class MergeSortApp
{
         public double[] theArray = {34,45,77,54};
         public void recMergeSort(double[] workspace,int low,int high)
         {
                  mid = (low+high)/2;
                  if(low==high)
                           return;
                  while(true)
                  {
                           recMergeSort(workspace,low,mid);
                           recMergeSort(workspace,mid+1,high);
                           Merge(workspace,low,mid+1,high);
                  }
         }
         public void Merge(double[] workspace,int lowPtr,int highPtr,int upperBound)
         {
                  int j = 0; //theArray index
                  int n = upperBound-lowptr+1;
                  int mid = highPtr-1;
                  while(lowPtr<=mid&&highPtr<=upperBound)
                  {
                           if(theArray[lowPtr]<theArray[highPtr]
                                    workspace[j++] = theArray[lowPtr++];
                           else
                                    workspace[j++] = thArray[highPtr++];
                  }
                  while(lowPtr<=mid)
                           workspace[j++] = theArray[lowPtr++];
                  while(highPtr<=upperBound)
                           workspace[j++] = theArray[highPtr++];
                  for(j=0; j<n; j++)
                           theArray[lowerBound+j] = workSpace[j];
         }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值