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

快速排序

时间:2019-03-07 12:52:15      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:void   快排   swap   return   ++   操作   oid   --   style   

快速排序,给定一个输入的子数组a[p:r],主要分为3步:

  1. 分解(partition): 以a[p]为基本元素,将数组a分为三段,a[p:q-1],a[q], a[q+1,r] 。其中第一段里的每一个元素都 <= a[q] , 第三段里的每一个元素都

            >= a[q]。

  2. 递归 (recursion) 。通过递归调用快排算法,分别对a[p:q-1] , a[q+1,r] 进行排序。

      3.合并(merge): 由于对a[p:q-1] 和 a[q+1,r]进行排序是就地进行的。所以,在这两段都排好序之后,不需要执行任何操作,数组a 就已经排好序了。

 

基于以上的思想,快排的伪代码如下:

void quickSort(int[] a,int p,int r){
     if(p<r){
               q = partition(a,p,r);
               quickSort(a,p,q-1);
               quickSort(a,q+1,r);  
    }  
}

  

对含有n个元素的数组a[0,n-1]进行快速排序,只要调用 quickSort(a,0,n-1)即可。

上述函数中的partition函数是快排的关键,以一个确定的基准元素a[p]对子数组a[p:r]进行划分。该函数返回下标q.

 

代码:

public int partition(int[] a, int p , int r){
    int i = p;
    int j = r+1;
    int x = a[p];
    // 将 < x 的元素交换到左边
   // 将 > x 的元素交换到右边
     while(true){
           while( a[ ++ i] < x  && i < r);
           while( a[ -- j] > x);
           if(i>=j) break;
           Swap(a[i],a[j]);
    }
    a[p] = a[j];
    a[j] = x;
   return j;


}

  

 

快速排序

标签:void   快排   swap   return   ++   操作   oid   --   style   

原文地址:https://www.cnblogs.com/vector11248/p/10488858.html

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