1. 思想
s
t
e
p
1.
step 1.
step1.通过一趟排序把数据分成两部分,
其
中
\color{red}{其中}
其中一部分的所有数据都要比另一部分的所有数据小,基准数据(称为枢轴)排在这两个子序列的中间
s
t
e
p
2.
step 2.
step2. 对这两个子序列
递
归
\color{red}{递归}
递归地调用排序算法
2. 代码
int partition(vector<int>& nums, int low, int high){
int pv = nums[low];
while(low < high){
while(low < high && nums[high] >= pv)
--high;
swap(nums[low], nums[high]);
while(low < high && nums[low] <= pv)
++low;
swap(nums[low], nums[high]);
}
// 返回枢轴的位置(重要!!!)
return low;
}
void QSort(vector<int>& nums, int low, int high){
if(low < high){
// 选一个pv值(称为枢轴),把数据分别放在该值左右两边,并把该值的位置返回出来
int pivot = partition(nums, low, high);
// 对子序列1排序
QSort(nums, low, pivot - 1);
// 对子序列2排序
QSort(nums, pivot + 1, high);
}
}
void QuickSort(vector<int>& nums, int len){ // O(nlogn)
QSort(nums, 0, len - 1);
}
int main(){
vector<int> nums = {22, 3, 1, 100, 50};
QuickSort(nums, nums.size());
for(int i = 0; i < nums.size(); i++){
cout << nums[i] << " " << endl;
}
return 0;
}
理解难点:partiton()
疑问:QSort() 开头的if判断怎么理解