快速排序(整数)的C语言代码和JAVA代码

发布时间 2023-03-25 21:23:49作者: Tomhard

一、问题描述

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

二、问题的解决办法

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

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

递归处理左右两端。

案例如下:

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

 

 

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

 

 

 

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

 

 三、代码实现:

C:

#include<stdio.h>
const 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);
        }
    }
}