步骤
1.每次将序列中的第一个元素作为一个一个基准,
2.在序列的左边找到第一个比基准元素大的值,在序列的右面找到第一个比序列小的值,交换这两个值,使得在这两个值的两边元素分别小于、大于基准元素。继续在序列中寻找,之后再交换,最终实现在某个位置,该元素的值(包括该元素)都比基准元素小,该元素的右面的元素值都比基准元素大。将这个值和基准元素进行交换,实现在基准元素的左边,元素值都比基准元素小,基准元素的右面都比基准元素大。
3.将序列分为三部分:基准元素的左边、基准元素、基准元素的右边。
进行分治。最终实现排序
算法实现:
void quickSort(int data[], int low, int high){
//判断当前序列中是否有元素
if (low < high){
//将序列的两端都戳上指针
int left = low;
int right = high-1;
//将序列的第一个元素作为基准值
//通过循环实现在某个位置,该位置的左面(包括该位置)都小于基准值,改位置的右面都大于基准值
while (left < right){
//通过循环找到序列左面第一个比基准值大的位置
for (; left < high&&data[left] <= data[low];left++);
//通过循环找到序列的右面第一个比基准值小的元素
for (; right > low&&data[right]>data[low];right--);
if (left < right){
//说明在当前序列中left和right都找到了符合条件的位置
//交换data[left]和data[right]的值实现在left的左面元素值都比基准值小,right的右面都比基准值大
int temp = data[left];
data[left]=data[right];
data[right] = temp;
}
}
//通过交换data[low]和datap[right]的值实现在基准值的左面元素都比基准值小,基准值的右面元素都比基准值大
int temp = data[low];
data[low] = data[right];
data[right] = temp;
//左递归调用
quickSort(data, low, right);
//右递归调用
quickSort(data, right + 1, high);
}
}
调试:
int main(void){
int data[8] = { 3, 2, 5, 8, 4, 7, 6, 9 };
quickSort(data, 0, 8);
for (int i = 0; i < 8; i++){
printf("%d ",data[i]);
}
return 0;
}
调试结果: