谜一样的后两个点
查看原帖
谜一样的后两个点
243896
Kclz楼主2022/7/22 13:38
#include<stdio.h>

void qsort(int head,int tail,int arr[]){
    if(head>=tail){
        return;
    }
    int i=head,j=tail,mid=arr[(head+tail)/2];
    while(i<=j){
        while(arr[i]<mid){
            i++;
        }
        while(arr[j]>mid){
            j--;
        }
        if(i<=j){
            int temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
            i++;
            j--;
        }
    }
    qsort(head,j,arr);
    qsort(i,tail,arr);
}

int main(){
    int n,num[1000000]={};
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
    }
    qsort(0,n-1,num);
    for(int j=0;j<n;j++){
        printf("%d ",num[j]);
    }
    return 0;
}

我就奇了怪了为什么我这个代码就能过所有的点,然而我重新写了一个快速排序(见下)就又不行了...有人能解释一下原理吗...

#include<stdio.h>
#include<stdlib.h>

void qs(int *a,int p,int r){
	if(p>=r){
		return;
	}
	int temp,i=p-1,piv=rand()%(r-p+1)+p;
	temp=a[piv];
	a[piv]=a[r];
	a[r]=temp;
	for(int j=p;j<r;j++){
		if(a[j]<=a[r]){
			i++;
			temp=a[i];
			a[i]=a[j];
			a[j]=temp;
		}
	}
	temp=a[i+1];
	a[i+1]=a[r];
	a[r]=temp;
	qs(a,p,i);
	qs(a,i+2,r);
}

int main(){
	int n,arr[1000000]={};
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&arr[i]);
	}
	qs(arr,0,n-1);
	for(int i=0;i<n;i++){
		printf("%d",arr[i]);
		if(i!=n-1){
			printf(" ");
		}else{
			printf("\n");
		}
	}
	return 0;
}
2022/7/22 13:38
加载中...