选择基准数(为方便选取第一个元素),定义两个指针 i, j
i从头开始扫, j从尾开始扫
使得基准数左边的元素小于基准数, 基准数右边的元素大于基准数
由于基准数选取的是第一个元素,j 先动, 找到小于基准数的值,i再动, 找到大于基准数的值,交换i和j的值
直到i和j相遇, 则把相遇位置的值和基准数的值交换
这时把数组看作只有三个元素,小于基准数,基准数, 大于基准数,此时是有序的
按照这种思想,递归处理小于基准数和大于基准数两部分
#include <bits/stdc++.h>
using namespace std;
void quick_sort(int *arr,int left,int right)
{
if(left>right)
return;
int i = left;
int j = right;
int at = *(arr+left);
while(i!=j)
{
while(*(arr+j)>=at&&i<j)
j--;
while(*(arr+i)<at&&i<j)
i++;
int tp = *(arr+j);
*(arr+j) = *(arr+i);
*(arr+i) = tp;
}
int tp = *(arr+left);
*(arr+left) = *(arr+i);
*(arr+i) = tp;
quick_sort(arr,left,i-1);
quick_sort(arr,i+1,right);
}
int main()
{
int arr[] = {6,1,2,7,9,3,10,5,4,8};
quick_sort(arr,0,9);
for(int i=0;i<10;i++)printf("%d ",arr[i]);
return 0;
}