码迷,mamicode.com
首页 > 编程语言 > 详细

算法:快速排序

时间:2016-12-05 01:38:11      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:快速排序法   方法表   blog   快速   break   return   rgs   val   com   

算法:快速排序(Java版本)


什么是快速排序法呢?

  快速排序法是十分盛行的,因为它实现简单,效率很高,尤其是对于大量的数据进行排序且在一般应用比其他算法更快速,并且可以在原地排序(仅仅使用一个辅助栈), 且将长为N的无序数组排序所需的时间与N.logN成正比。

  快速排序法思想:

  •   取序列中的某个元素作为基准(pivot, 或称为枢轴,一般取第一个元素
  •   通过一趟排序,将待排序列划分(Partition)为左右两个子序列    
  •   左子序列元素的关键字均不大于基准元素的关键字,右子序列的关键字均不小于基准元素的关键字。
  •   然后分别对左右两个子序列继续进行快速排序,直至整个序列有序。

  图示:    

    技术分享

    注意:左右子序列元素的特点。

划分

 public static int partition(int[] aux,int lo,int hi)
    {
        int i=lo,j=hi+1; //左右两个指针,分别从两端开始
        int val = aux[lo]; //去最左边的第一个元素为枢纽元素
        while (true)
        {
            while (aux[++i]<val)if(i==hi)break; //左指针向右找到一个大于枢纽的
            while (aux[--j]>val)if(j==lo)break; //右指针向左找到一个大于枢纽的
     
            if(i==j) break; //这个i=j是很关键的,两指针重合,则表示能找的都找了!
            exch(aux,i,j);  //i!=j,表示还有能找的!
        }
        exch(aux,lo,j); //把枢纽元素交换至它应该的位置!
        return j; //把划分点返回区,目的是说,从这里开始,两边分别已成为为左右子序列。

    }

  说明:

    技术分享

排序

    public static void sort(int[] aux,int lo,int hi)
    {
        if(lo>=hi)    
            return;
        int val = partition(aux,lo,hi);       //进行递归划分
        sort(aux,lo,val-1);
        sort(aux,val+1,hi);
    }

 

  说明:

    我们在划分的时候已经说明:

    return j; //把划分点返回区,目的是说,从这里开始,两边分别已成为为左右子序列。

    partition方法表示已经将一个j的两边划分为左右子序列。

 左子序列元素的关键字均不大于基准元素的关键字,右子序列的关键字均不小于基准元素的关键字。

     但此时整个数组来说,还不是有序的,递归的进行划分,就是为了能让这种划分方法落实到每一个元素

完整代码     

public class Main {

    public static void main(String[] args) {
        int[] aux={5,7,9,5,3,2};
        sort(aux,0,aux.length-1);
        for (int i:
             aux) {
            System.out.println(i);
        }


    }
    /*快速排序法,JAVA实现代码*/
    public static int partition(int[] aux,int lo,int hi)
    {
        int i=lo,j=hi+1; //左右两个指针
        int val = aux[lo];
        while (true)
        {
            while (aux[++i]<val)if(i==hi)break;
            while (aux[--j]>val)if(j==lo)break;
            if(i==j) break;
            exch(aux,i,j);
        }
        exch(aux,lo,j);
        return j;

    }

    public static void sort(int[] aux,int lo,int hi)
    {
        if(lo>=hi)
            return;
        int val = partition(aux,lo,hi);
        sort(aux,lo,val-1);
        sort(aux,val+1,hi);
    }

    public static void exch(int[] aux,int i,int j)
    {
        int t=aux[i];
        aux[i]=aux[j];
        aux[j]=t;
    }
}

算法:快速排序

标签:快速排序法   方法表   blog   快速   break   return   rgs   val   com   

原文地址:http://www.cnblogs.com/MrSaver/p/6017981.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!