快速排序是一种常用且比较复杂的排序算法,最坏的情况下运行时间为O(n2) , 期望的运行时间为O(nlgn). 快速排序采用分治思想,分治过程分为三个步骤。(ps:以下思想参考算法导论)
分解: 数组A[p...r] 被划分成2个子数组。 子数组A[p..q-1](ps:可以把它想象成数组中的前半部分 )和A[p...r](ps:可以把它想象成后半部分)。使得A[p....q-1]中的每个元素都小于等于A(q),而且小于等于A[q+1....r]中的元素。下标q也在这个划分过程中计算... (ps:什么意思呢.假定我们有待排序数组,数组长度为10 那么我们可以把其中的第一个元素取出来 和后半部分的元素进行比较 如果比第一个元素小 那么我们将那个小于第一个元素的后半部分的那个元素取出来 放到第一个元素的下标位置. 然后在从前半部分找比这个第一个元素小的元素把他填充到后半部分刚刚取出来的那个元素的位置 直到数组中没有比这个第一个元素大或者小的数. 这里我们已经完成了一遍分治思想。 因为这个取出来的第一个元素他最后被填充的位置的前半部分一定都比他大 后半部分都比他小.
解决: 通过分解后 ,我们可以递归调用 对子数组 A[p..q-1]和A[q+1.....r]排序 其实就是对前半部分和后半部分的子数组进行递归调用,让他一遍遍的分解。直到 p==r 递归调用完毕
伪算法(ps:伪算法参考算法导论)
QUICKSORT(A,p,r)
if p< r
then q<- PARTTION(A,p,r);
QUICKSORT(A,p,q+1); //对前半部分进行分解
QUICKSORT(A,q-1,r); //对后半部分进行分解
下面以个人理解实现:
public int Q_sort(int array[] , int begin, int end)
{
int pos = array[begin]; //第一个匹配位置空出来
while(begin<end)
{
while(begin<end && array[end]>=pos)
end--;
array[begin]= array[end];
while(begin<end && array[begin]<=pos)
begin++;
array[end]=array[begin];
} //对pos的数组分治一次
array[begin]= pos;
return begin;
}
public void sort_rt(int array[], int begin, int end)
{
if(begin < end)
{
int p =Q_sort( array, begin, end);
sort_rt(array, begin,p-1);
sort_rt(array, p+1,end);
}
}