• 排序算法——快速排序


    快速排序

       快速排序是一种分治的排序算法。他将一个数组分成两个子数组,将两个部分独立地排序。

    归并排序的递归调用在处理整个数组之前,快速排序的递归调用发生在处理整个数组之后。

      切分的策略是随意地取a[lo]作为切分元素,从数组左端开始向右直到找到一个大于等于它的元素,再从数组右端直到找到一个小于等于它的元素。显然这个元素是没有排定的,因此交换他们的位置。如此继续,当两个指针相遇,我们只需要切分元素和指针位置交换,返回指针位置即可。

    快速排序框架

    public class Quick
    {
      public static void sort(Comparable[] a,int lo, int hi)
      {
        if(hi <= lo) return;
        int j = partition(a,lo,hi);//切分
        sort(a,lo,j-1);//将左半部分进行排序
        sort(a,j+1,hi);//将右半部分进行排序
      }
      public static void sort(Comparable[] a)
      {
        stdRandom.shuffle(a);//消除对输入的依赖
        sort(a,0,length-1);
      }
    }
        

    快速排序的切分

     1 private static int partition(Comparable[] a, int lo, int hi)
     2 {
     3    int i =lo,j = hi+1;
     4     Comparable  v = a[lo];
     5     while(true)
     6     {
     7         while(less(a[++i],v)) if(i==hi) break;
     8         while(less(v,a[--j])) if(j==lo) break;
     9         if(i>=j) break;
    10         exch(a,i,j);
    11     }
    12     exch(a,lo,j);
    13     return j;
    14 }

    快速排序的最差时间复杂度为O(N2),平均时间复杂度为O(N*logN)

    注意:1.对于小数组,快速排序比插入排序慢。

       2.对于含有大量重复元素的数组,我们将数组切分为三部分,分别对应于小于等于和大于切分元素的数组元素。

      

  • 相关阅读:
    MVC 数据库增删改查(2) 视图
    MVC 数据库增删改查(1)
    委托的4种写法
    wpf 多线程操作(2)
    wpf 多线程操作例(1)
    网络抓取邮箱
    wpf 点击新建弹出新的窗口
    wpf 数据绑定 联系
    wpf 在listview里添加数据
    面向对象:抽象基类,接口
  • 原文地址:https://www.cnblogs.com/timesdaughter/p/5316957.html
Copyright © 2020-2023  润新知