面试真题实现一个快速排序

Posted Cry丶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试真题实现一个快速排序相关的知识,希望对你有一定的参考价值。

题干:
我们使用的是经典快速排序: 以左边界为基准值base,具体分析过程详见博主【Java版算法思想(排序)】选择&冒泡&快排

参考代码:

/**
 * @author cry777
 * @program demo1
 * @description 经典快速排序: 以左边界为基准值
 * @create 2022-02-25
 */
public class QuickSort 

    public static void main(String[] args) 
        int data[] = 45, 28, 80, 90, 50, 16, 100, 10;
        qSort(data, 0, data.length - 1);
        for (int j = 0; j < data.length; j++) 
            System.out.print(data[j] + " ");
        

    

    /**
     * 这边有个细节,就是每次调换完以后的ll和rr,都有一方是基准数
     * 全部遍历完后,ll和rr会和基准数的位置重合
     * 每次交换完基准数和另一侧的++位置的数相比
     * 45, 28, 80, 90, 50, 16, 100, 10
     * 10, 28, 80, 90, 50, 16, 100, 45
     * 10, 28, 45, 90, 50, 16, 100, 80
     * 10, 28, 16, 90, 50, 45, 100, 80
     * 10, 28, 16, 45, 50, 90, 100, 80
     */
    public static void qSort(int data[], int left, int right) 

        int base = data[left]; // 就是我们的基准数,取序列的第一个,不能用data[0]
        int ll = left; // 表示的是从左边找的位置
        int rr = right; // 表示从右边开始找的位置
        while (ll < rr) 
            // 从后面往前找比基准数小的数
            // int data[] = 45, 28, 80, 90, 50, 16, 100, 10;
            while (ll < rr && data[rr] >= base) 
                rr--; // 没找到就--
            
            if (ll < rr)  // 表示是找到有比之大的
                exchange(data, ll, rr);
                ll++;
            
            while (ll < rr && data[ll] <= base) 
                ll++;
            
            if (ll < rr) 
                exchange(data, ll, rr);
                rr--;
            
        
        // 肯定是递归 分成了三部分,左右继续快排,注意要加条件不然递归就栈溢出了
        if (left < ll - 1) 
            qSort(data, left, ll - 1);
        
        if (ll < right - 1) 
            qSort(data, ll + 1, right);
        
    

    public static void exchange(int data[], int a, int b) 
        if (a != b) 
            data[a] = data[a] - data[b];
            data[b] = data[a] + data[b];
            data[a] = data[b] - data[a];
         else 
            return;
        

    

输出:

10 16 28 45 50 80 90 100 

以上是关于面试真题实现一个快速排序的主要内容,如果未能解决你的问题,请参考以下文章

面试官:手写一个快速排序,并对其改进

快速排序的几种优化的实现

算法高频面试之:快速排序

快速排序的几种优化

华为机试真题 C++ 实现字符串排序

还记得快速排序吗?面试必备