算法学习(排序三)快速排序

快速排序和归并排序一样,都用到了递归的方法,具体做法是先选取一个数为关键数据(一般选择第一个数),将数组中小于该数的放在左侧,大于该数的放在右侧;排序完成后对左右两个部分进一步的做如上操作

/** 快速排序,指定一个位置,经过排序后,是该位置的数的左边全部是小于该数,邮编全部是大于该数  @param array 需要排序的数组  @param left 左边座标  @param right 右边座标 */
void quickSort (int *array, int left, int right)
{
    //TODO 1.当左边座标大于右边座标是,代表该区间内已经排序完毕
    if (left >= right)
        return;

    //TODO 2.添加辅助参数,key是关键数据,用来进行对比,一般选择第一个
    int low = left;
    int height = right;
    int key = array[left];

    //TODO 3.开始遍历,左右两边索引往中间移动
    while (low < height)
    {
        //TODO 4.右侧移动,直到小于key的为止,将其放在low的为止
        while (low < height && array[height] >= key)
            height--;

        array[low] = array[height];

        //TODO 5.左侧移动,直到大于key的为止,将其放在low的位置
        while (low < height && array[low] <= key)
            low++;

        array[height] = array[low];
    }

    //TODO 5.最后将保存的key放在low处,此时,在key的左边的都是小于key的数,右边的都是大于key的数
    array[low] = key;

    //TODO 6.将左侧和右侧继续排序
    quickSort(array, left, low - 1);
    quickSort(array, low + 1, right);
}
点赞