一、问题描述
我们目前有一些数据,这些数据都是整数,然后我们现在需要做的就是把这些数据按照小到大排一下,然后输出出来。
二、问题的解决办法
首先确认一下分界点,我们常见的分界点是第一个点,第二个点,中间的一个点;
然后我们调整一下范围,也就说所有小于等于某个点的值在左半边,大于等于某个点的值在右半边。
递归处理左右两端。
案例如下:
我们首先手头有一些数据,这些数据我们为了好排序,可以把他们都放在数组当中,这样每个数据都有一个下标了,也就确定了它们的位置。如下:
这个时候我们选好了分界值,如上所示,为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); } }}