快速排序

void qsort(int* array,int size)
{
    if(size<=1)
        return;
    int* pEnd=array+size-1;
    int* pBegin=array;
    while(pEnd!=pBegin)
    {
        while(*pEnd>=*pBegin&&pEnd>pBegin)
            --pEnd;
        if(pEnd==pBegin)
            break;
        swap(pEnd,pBegin);
        pBegin++;
        while(*pEnd>=*pBegin&&pEnd>pBegin)
            ++pBegin;
        if(pEnd==pBegin)
            break;
        swap(pEnd,pBegin);
        pEnd--;
    }
    int front_part=pEnd-array;
    qsort(array,front_part);
    qsort(pEnd+1,size-front_part-1);

}

快速排序,简单来说就是找数组中的一个元素为基准,通过只遍历数组一边的方法,将数组调整成,基准值左边所有元素都不大于基准值,基准值右边所有元素都不小于基准值的状况。然后递归的将基准值左右的两个子数组调整成这种状况。以实现数组的排序

调整的方法:

1.将数组首元素作为基准值

2.从数组未被遍历的部分的尾部向前遍历,找到一个比基准值小的元素,将他与基准值交换位置

3.从数组未被遍历部分的头部向后遍历,找一个比基准值大的元素,将他与基准值交换

4 经过一轮2,3后,左侧被遍历过的位置都保存着不比基准值大的元素,而右侧被遍历过的位置都保存着不比基准值小的元素。循环2,3直到所有的位置都被遍历过,此时基准值左边的值都不大于基准值,而基准值右侧的元素都不小于基准值

发表回复