一、问题描述

我们目前有一些数据,这些数据都是整数,然后我们现在需要做的就是把这些数据按照小到大排一下,然后输出出来。

二、问题的解决办法

首先确认一下分界点,我们常见的分界点是第一个点,第二个点,中间的一个点;

然后我们调整一下范围,也就说所有小于等于某个点的值在左半边,大于等于某个点的值在右半边。

递归处理左右两端。

案例如下:

我们首先手头有一些数据,这些数据我们为了好排序,可以把他们都放在数组当中,这样每个数据都有一个下标了,也就确定了它们的位置。如下:

这个时候我们选好了分界值,如上所示,为8。下一步我们就进行位移:

由于8=8,所以i静止不动,9>8,这就使得j–;如下:

三、代码实现:

C:

#includeconst int N=1e6+10;int n;int q[N];void quick_sort(int q[],int l,int r){    if(l>=r) return ;//判定边界    int x=q[l],i=l-1,j=r+1;    while(i<j){        do i++;while(q[i]<x);        do j--;while(q[j]>x);        if(i<j){            int t=q[i];            q[i]=q[j];            q[j]=t;        }    }    quick_sort(q,l,j);    quick_sort(q,j+1,r);}int main(){    scanf("%d",&n);    for(int i=0;i<n;i++) scanf("%d",&q[i]);    quick_sort(q,0,n-1);    for(int i=0;i<n;i++) printf("%d ",q[i]);    return 0;}

JAVA:

import java.util.Scanner;;public class quick_sort {    public static void main(String[] args){        Scanner sc=new Scanner(System.in);        int n=sc.nextInt();        int[] arr=new int[100010];        for(int i=0;i<n;i++){            arr[i]=sc.nextInt();        }        quick_s(arr,0,n-1);        for(int i=0;i<n;i++){            System.out.printf("%d ",arr[i]);        }    }    public static void quick_s(int q[],int l ,int r) {        int i=l-1;        int j=r+1;        int x=q[l+r>>1];        if(l>=r) return;        while(i<j){            do i++;while(x>q[i]);            do j--;while(x<q[j]);            if(i<j){                int t=q[i];                q[i]=q[j];                q[j]=t;            }            quick_s(q, l, j);            quick_s(q, j+1, r);        }    }}