求助QAQ求问哪错了
查看原帖
求助QAQ求问哪错了
146325
ggcglylc楼主2021/2/26 12:33
#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

2021/2/26 12:33
加载中...