代码如下
#include <iostream>
using namespace std;
int swap(int *a,int *b){ //交换
int tmp = *a;
*a = *b;
*b = tmp;
return 0;
}
int partition(int a[],int low,int high){
int poi = a[high];
int i = low;
for (int j = low; j < high; j++) { //这个地方要小于high,因为不用去判断最后一位
if (a[j]<poi){
swap(&a[i],&a[j]); //i和j的位置
i++;
}
}
swap(&a[i],&a[high]);
return i; //i是正确位置的下标
}
int qsort(int a[],int low,int high){
if (low<high){
int mid = partition(a,low,high); //获取最后面的数的正确位置,将前后的数继续快速排序,递归思想
qsort(a,low,mid-1); //mid直接-1就是前一个数的下标
qsort(a,mid+1,high);
}
return 0;
}
int quick_sort(int a[],int len){
qsort(a,0,len-1); //入口
for (int i = 0; i < len; i++) {
cout << a[i]<< " ";
}
return 0;
}
int main(){
int n = 0;
cin >> n;
int arr[n];
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
quick_sort(arr,n);
return 0;
}
关于具体的ij问题,可以参考这位up的视频
排序算法:快速排序【图解+代码】
他的图解思路没问题,大概是我才疏学浅,我认为我写的会更好一点,对于我来说,本算法的关键就是掌握好长度与下标的关系,和如何处理好i和j的关系,即如何去把最后那个数放在正确的位置。