【acwing】785. 快速排序

给定你一个长度为 n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。
输入格式
输入共两行,第一行包含整数 n。
第二行包含 n个整数(所有整数均在 1∼109范围内),表示整个数列。

输出格式
输出共一行,包含 n个整数,表示排好序的数列。
数据范围
1≤n≤100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

#include<iostream>
using namespace std;
int p[100005],n;

void quick_sort(int p[],int l,int r){
    
    
    if(l>=r){
    
    
        return ;
    }
    
    int i=l-1;
    int j=r+1;
    int mid=p[(r+l)/2];
    
    while(i<j){
    
    
            // do{
    
    
            //     i++;
            // }while(p[i]<mid);
            // do{
    
    
            //     j--;
            // }while(p[j]>mid);
            
            while(p[++i]<mid);
            while(p[--j]>mid);
            
            if(i<j){
    
    
                swap(p[i],p[j]);
            }
            
    }
    quick_sort(p,l,j);
    quick_sort(p,j+1,r);
}

int main(){
    
    
    cin>>n;
    for(int i=0;i<n;i++){
    
    
        cin>>p[i];
    }
    
    quick_sort(p,0,n-1);
    
    for(int i=0;i<n;i++){
    
    
        if(i!=n-1){
    
    
            cout<<p[i]<<" ";
        }else{
    
    
            cout<<p[i]<<endl;
        }
    }
    
    return 0;
}

之前的一些错误想法

1、为什么在while的判断里不能写成如下样子:

while(i<j){
    
    
        do{
    
    
			i++;
		
        } while(q[i]<q[mid]);
        do{
    
    
        	j--; 
        	
        } while(q[j]>q[mid]);
        if(i<j) swap(q[i],q[j]);
    }

原因:
错误原因,在一开始进入quick_sort的时候,没有直接将q【mid】的值取出来,而是放在了while循环里取 造成的后果是,当如果出现q[mid]和mid后面的某个值换位置的时候,q[mid]的值会换掉,从而使得q[mid] 改变,导致结果错误,因此,需要在一进入的时候就将q[mid]取出。


2、quick_sort函数的写法问题 如下:
    quick_sort(q,l,i);
    quick_sort(q,i+1,r);

原因:

为什么不能使用i作为有边界呢? i可以一直增大,当i增加到最大时,会出现i+1越界, 而j肯定是在减小的,不会出现类似问题

注意问题

进入函数判断时

 if(l>=r){
    
    
        return ;
    }

很容易错写成ij的判断…

猜你喜欢

转载自blog.csdn.net/qq_43531919/article/details/115095544