快速排序和归并排序一样,都用到了递归的方法,具体做法是先选取一个数为关键数据(一般选择第一个数),将数组中小于该数的放在左侧,大于该数的放在右侧;排序完成后对左右两个部分进一步的做如上操作
/** 快速排序,指定一个位置,经过排序后,是该位置的数的左边全部是小于该数,邮编全部是大于该数 @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);
}