[Java]小白日记之实现快速排序🔥

59 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路 持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情 最近初学java,写文来记录一下java的学习过程,今天用java实现了快速排序。在此重新回顾一下快速排序的原理;

<快速排序>

快速排序先要指定一个排序的区间,在这个区间中,找到一个基准数,我们一般指定这个基准数为数组最中间的数,它的下标是 mid=(L+R)/2,对于这个区间,我们希望在arr[mid]左边的数都要比arr[mid]小,右边的数都要比它大。如此,这个区间就排序好了。

那我们具体要如何操作呢?

我们设置一个变量i指向数组最左端,变量j指向数组最右端,然后让i从左往右,找到第一个比arr[mid]大的数(因为我们的区间左半边是要比arr[mid]小的,如果有大的就不符合升序了),同理:让“指针”j从右往左寻找第一个比arr[mid]小的数。然后在两个过程都执行完了之后,交换arr[i]arr[j]。直到“指针”i和j相遇为止;

上文的指针不是指C语言或者C++中存放地址的指针,而是双指针函数中的指针


public class Main {
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        int n=cin.nextInt();
        int[] arr=new int[n+1];
        for(int i=1;i<=n;i++)arr[i]=cin.nextInt();
        quick_sort(1,n,arr);
        for(int i=1;i<=n;i++)
            System.out.printf("%d ",arr[i]);
    }
    public static void quick_sort(int l,int r,int arr[]){
        int i=l,j=r;
        int mid=arr[(l+r)/2];
        do{
            while(arr[i]<mid)i++;
            while(arr[j]>mid)j--;
            if(i<=j) {
//                arr[i]=arr[i]^arr[j];
//                arr[j]=arr[i]^arr[j];
//                arr[i]=arr[i]^arr[j];
                swap(arr,i,j);
                i++;j--;
            }
        }while(i<=j);
        if(l<j)quick_sort(l,j,arr);
        if(i<r)quick_sort(i,r,arr);
    }
    public static void swap(int arr[],int id1,int id2){
        int temp=arr[id1];
        arr[id1]=arr[id2];
        arr[id2]=temp;
    }
}