Loading

算法基础课_基础算法_快速排序

快速排序的思想
基于分治的思想:
步骤:

  • 确定分界点 q[l], q[l+r >> 1], q[r]
  • 调整区间
  • 递归处理两个子区间

快速排序的基本模板

  //手写一个快排
public static void quick_sort(int[] arr, int l, int r){
    if(l >= r) return ;

    int p = arr[l];

    int i = l - 1;
    int j = r + 1;

    while(i < j){

        do {
            i++;
        }while (arr[i] < p);

        do {
            j--;
        }while (arr[j] > p);

        if(i < j){
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
    }

    //递归处理两边
      quick_sort(arr, l, j);
      quick_sort(arr, j+1, r);

}

一个小细节:分界点选择左端点, 递归的时候使用j变量,这样可以防止产生边界问题

例题:
AcWing 785. 快速排序


import java.util.*;

public class Main {
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i ++){
            arr[i] = sc.nextInt();
        }
        
        
        quick_sort(arr,0,arr.length-1);
        
        for(int i = 0; i < n; i ++){
            System.out.print(arr[i]+" ");
        }
        
    }
    
    public static void quick_sort(int[] arr, int l, int r){
        if(l >= r) return ;

        int p = arr[l];

        int i = l - 1;
        int j = r + 1;

        while(i < j){

            do {
                i++;
            }while (arr[i] < p);

            do {
                j--;
            }while (arr[j] > p);

            if(i < j){
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }

        quick_sort(arr, l, j);
        quick_sort(arr, j+1, r);

    }
    
    
}

AcWing786 第K个数


import java.util.*;

public class Main {
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt();
        int[] arr = new int[n];
        for(int i = 0; i < n; i ++){
            arr[i] = sc.nextInt();
        }
        
        
        quick_sort(arr,0,arr.length-1);
        
        for(int i = 0; i < n; i ++){
            System.out.print(arr[i]+" ");
        }
        
    }
    
    public static void quick_sort(int[] arr, int l, int r){
        if(l >= r) return ;

        int p = arr[l];

        int i = l - 1;
        int j = r + 1;

        while(i < j){

            do {
                i++;
            }while (arr[i] < p);

            do {
                j--;
            }while (arr[j] > p);

            if(i < j){
                int tmp = arr[i];
                arr[i] = arr[j];
                arr[j] = tmp;
            }
        }

        quick_sort(arr, l, j);
        quick_sort(arr, j+1, r);

    }
    
}
posted @ 2021-04-26 20:08  想用包子换论文  阅读(36)  评论(0编辑  收藏  举报