将数组最左边的元素赋值给pivot
left = 1; right = n(数组最后一个元素下标)
要定义两个变量 i = left j = right 不直接使用left和right 以免丢失原值
此时左边这个数的位置为空出来了,那么从右边找一个比pivot小的数放入, 接着右边右空出来一个位置,那么从左边找一个比pivot大的数让入;
当 i== j 时就是pivot的正确位置把pivot放入,
此时的pivot 前面的元素都是比pivot 小的, pivot后面的元素都是比pivot 大的.
那么把可以把把它分为两半: 左半部分为: [ left , i-1 ] 右半部分为:[ i+1 , right ]
使用递归完成左半部分和右半部分, 一直循环上面的步骤直至排序完成
//快速排序算法;
void QuickSort(int arr[],int left,int right)
{
int i = left, j = right; //传入的left 和 right 代表这一趟的范围
int pivot;
if (i < j){ //如果当 i == j 时就代表它的右边已经有序了
int flat = 1; //flat = 1 时就代表要去右边找一个小的, flat = 0 时 就要去左边找个大的
pivot = arr[i];
while (i != j) //i != j 时一直循环,从左边找个比pivot 大 的放右边,从右边找个比pivot 小 的放左边
{
if(flat == 1)
{ if(pivot > arr[j]){
arr[i] = arr[j];
i++; flat = 0; //已经从右边找了个小的放在左边,此时右边空了,即下次要去左边找,则把flat 改为 0;
}
else j--;
}
else{
if(pivot < arr[i]){
arr[j] = arr[i];
j--; flat = 1; //已经从左边找了个大的放在右边,此时左边空了,即下次要去右边找,则把flat 改为 1;
}
else i++;
}
}
arr[i] = pivot;
//反复循环,递归,即把这个范围一直缩小,直至有序
QuickSort(arr,left,i-1); //left 到当前pivot位置的左侧
QuickSort(arr,i+1,right); //当前pivot位置的右侧到 right
}
}