数据结构与算法之排序

来源:互联网 发布:重启mysql服务 编辑:程序博客网 时间:2024/05/29 11:35
简单的排序算法有冒泡排序、选择排序和插入排序,今天在这里总计一下各种排序算法的知识,方便以后再看的时候用到。
冒泡排序执行的算法如下:
假如现在有一个队伍,人数为N,需要按从低到高的顺序从左到右排序:
从队列的最左边开始,比较0号位置的队员和1号位置的队员。如果左边的队员比右边的高,就让两个队员交换,如果右边
的队员高就什么也不做,然后右移一个位置,比较1号位置和2号位置的队员,然后如果左边高就就把连个队员交换位置,
一直到N-1,这样执行完一次虽然没有没有排好序,但是已经把最高的排在了队伍的最右边,然后进行下一次排列知道N-2,
一直排到1就把这个队列按顺序排列了。下面是用JAVA写的代码:
public void bubbleSort(){
    int out in;
    for(out=nElem-1;out>1;out--){
       for(in=0;in<out;in++){
          if(a[in]>a[in+1]){
           swap(in,in+1);
          }
       }
    }
}
swap 的代码是:
   private  void swap(int one,int two){
        long temp=a[one];
        a[one]=a[two];
        a[two]=temp;
   }
算法的效率:一般来说如果数组中有N个数据项,第一次排序进行N-1次比较,第二次进行N-2次比较,如此类推,
所以一共进行比较的次数是:N-1+N-2+N-3+……+N-3=N*(N-1)/2;忽略1就是N^2/2
如果数据是随机的那么将有一半的数据进行交换,那么交换的次数为N^2/4,这个算法的运行时间及时间复杂度为O(N^2)
选择排序:
选择排序的算法将交换次数从O(N^2)变成了变成了O(N),但是比较次数仍旧为:N^2/2
该算法的主要思想是:首先从第一个开始遍历了整个队伍,找出队伍中最矮的那个人,然后把他放到队伍的第一个位置,
把第一个位置的放到空出来的那个位置,然后从第二个开始再进行上一个步骤,直到把队伍中所有的队员都排序就可以了。
算法的代码:
   public  void  selectSort(){
       int out,in,min;
       for(out=0;out<nElem-1;out++){
          min=out;
          for(in=out+1;in<nElems;in++){
              if(a[in]<a[min]){//找到一个更小的值就进行交换
               min=in;
              }
         swap(out,min);
          }
       }   
   }
从上面的两个算法中可以看出,之所以选择排序中数据交换的次数变成了O(N),那是因为交换的那个代码放在了第一个循环里,
并没有放在第二个循环里,所以交换的次数就降低了一个数量级。所以这两种算法进行比较的话,肯定是选择排序更快,当N值
较小时,特别是如果交换的时间级比比较的时间大得多时,选择排序实际上是相当快的。
另外一种算法是插入排序:
插入排序在这三个算法中是最好的一种,虽然插入排序算法仍然需要O(N^2)的时间,但是在一般情况下,它要比冒泡排序快一倍,
比选择排序还要快一点。该算法的主要思想是:假设某个位置的人前面的人都已经是排好位置的,这个位置就是被标记的位置,然
后把处于标记位置的元素放到临时变量里,然后从标记位置的前一个位置开始和那个临时变量进行比较,如果比它大的话就向右进
行移动,直到移动到不小于临时变量的位置,就把这个临时变量插到这个位置,然后把那个标记位置向前移动一个位置。直到把所
有的变量全部排序。
下面是代码:
public void insertionSort(){
   int in,out;
   for(out=1;out<nElems;out++){
       long temp=a[out];//复制这个临时变量
       in=out;
       while(in>0&&a[in-1]>=temp){
        a[in]=a[in-1];
        --in;
       }
       a[in]=temp;
   }
}
0 0
原创粉丝点击