#include <iostream>
#include <cstdio>
using namespace std;
int partition(int A[], int left, int right){
int pivot = A[left];
int l = left + 1;
int r = right;
while(l <= r){
while(l <= r && A[l] <= pivot)l++;
while(l <= r && A[r] > pivot)r--;
if(l < r){
int t = A[l];
A[l] = A[r];
A[r] = t;
}
}
A[left] = A[r];
A[r] = pivot;
return r;
}
void quicksort(int A[], int left, int right){
if(left < right){
int m = partition(A, left, right);
quicksort(A, left, m - 1);
quicksort(A, m + 1, right);
}
}
int main(){
int n;
scanf("%d", &n);
int A[n];
for(int i = 0;i < n;i++){
scanf("%d", &A[i]);
}
quicksort(A, 0, n - 1);
printf("%d", A[0]);
for(int i = 1;i < n;i++){
printf(" %d", A[i]);
}
printf("\n");
return 0;
}
后三个点TLE了 但是后面这个版本 就只有后面两个点TLE
#include <iostream>
#include <cstdio>
using namespace std;
void insertsort(int data[], int left, int right){
for (int i = left + 1; i <= right; i++)
for (int j = i; j > 0 && data[j] < data[j-1]; j--){
int t = data[j];
data[j] = data[j - 1];
data[j - 1] = t;
}
}
void quicksort(int data[], int left, int right){
if(left < right){
if(right - left + 1 < 10){
insertsort(data, left, right);
return;
}
int pivot = data[left];
int l = left + 1;
int r = right;
while(l <= r){
if(data[l] <= pivot){
l++;
}else{
int t = data[l];
data[l] = data[r];
data[r] = t;
r--;
}
}
data[left] = data[r];
data[r] = pivot;
quicksort(data, left, r - 1);
quicksort(data, r + 1, right);
}
}
int main(){
int n;
scanf("%d", &n);
int data[n];
for(int i = 0;i < n;i++){
scanf("%d", &data[i]);
}
quicksort(data, 0, n - 1);
printf("%d", data[0]);
for(int i = 1;i < n;i++){
printf(" %d", data[i]);
}
return 0;
}
另外还有一个问题,为什么我看到的教程版本是先移动左指针再移动右指针 但是大家都是先移动右指针啊 有什么区别嘛QAQ