快速排序算法

简介: 快速排序算法

步骤:1. 先在数组元素中选出一个基准值(pivot)(比较值)

          2. 将数组中大于基准值(pivot)的元素统一移到基准值右边

             将数组中小于基准值(pivot)的元素统一移到基准值左边

          3. 用递归的方式分别对基准值(pivot)左右两边的子序列重复前两步操作,完成快速排序

 

基本思路:一般选择将待排序序列分为两个序列,正中间的那个数作为关键字,然后两个指针一个从头到关键字遍历,遇到大于(小于)关键字的元素就停下来,另一个指针从尾到关键字遍历,遇到小于(大于)关键字的元素停下来,交换两个指针的元素完成排序;将序列递归分治按照前面的原理排序,直到序列有序。

 

平均时间复杂度:image.png

 

1.main 方法调用排序算法对数组进行排序

public class QuickSort {
    private static int count;
    public static void main(String[] args) {
        int[] arr = {3, 45, 78, 99, 45, 11, 64, 55, 52, 11, 18, 66, 17, 37, 199, 120, 54, 49};
        System.out.println("未排序的数组:" + Arrays.toString(arr));
        quickSort01(arr, 0, arr.length - 1);
        System.out.println("排序的数组:" + Arrays.toString(arr));
    }

2. 快速排序算法(以中间元素为基准)

/**
     * 快速排序算法(以中间元素为基准)
     * @param arr     排序的数组
     * @param left    左指针
     * @param right   右指针
     */
    private static void quickSort01(int[] arr,int left,int right){
       int l = left;
       int r = right;
       int pivot = arr[(left+right)/2];//选取数组中间元素作为基准
       int temp = 0;//temp作为中间转换变量
       while (l<r) {
           while (arr[l] < pivot) {//当左元素小于基准时,就往右进一位
               l++;
           }
           while (arr[r] > pivot) {//当右元素大于基准时,就往左进一位
               r--;
           }
           if (l >= r) {//当两个指针指向同一个位置时,就跳出循环
               break;
           }
           //交换值,左指针所指大于基准值的与右指针所指小于基准值的交换位置
           temp = arr[l];
           arr[l] = arr[r];
           arr[r] = temp;
           if (arr[l] == pivot) {//如果左指针指向元素的值等于基准值,右指针往左移动一格
               r--;
           }
           if (arr[r] == pivot) {//如果右指针指向元素的值等于基准值,左指针往右移动一格
               l++;
           }
       }
       //第一次排序结束后,用递归的方式,
        //开始对基准值两边的元素开始排序
       if (l==r){
           l++;
           r--;
       }
       if (left<r){
           quickSort01(arr,left,r);
       }
       if (l<right){
           quickSort01(arr,l,right);
       }
    }

3. 快速排序算法(以第一个元素为基准)

/**
     *  快速排序算法(以第一个元素为基准)
     *  @param arr 排序的数组
     * @param left 数组的第一个元素索引
     * @param right 数组的最后一个元素索引
     */
    private static void quickSort02(int[] arr,int left,int right){
        if (left >= right){
            //递归退出条件
            return;
        }
        int l = left;//l为数组的左指针
        int r = right;//r为数组的右指针
        while (l<r){
            while (l<r && arr[r]>=arr[left]) {//如果右指针所指元素大于基准数,就往左移动
                r--;
            }
            while (l<r && arr[l]<=arr[left]){//如果左指针所指元素小于基准数,就往右移动
                l++;
            }
            if (l == r){//如果两个指针指向同一个元素,就将此元素与第一个元素对调位置
                int temp = arr[left];
                arr[left] = arr[r];
                arr[r] = temp;
            }else{//如果两个指针没有指向同一个位置,就将两个指针所指向的元素对调位置
                int temp = arr[l];
                arr[l] = arr[r];
                arr[r] = temp;
            }
            QuickSort.count++;//计算排序总共调用用了多少次
        }
        quickSort02(arr,left,l-1);//递归方式对基数左边的数进行排序
        quickSort02(arr,r+1,right);//递归方式对基数右边的数进行排序
    }
}
相关文章
|
2月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
22 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
5月前
|
算法 前端开发
前端算法之快速排序
前端算法之快速排序
43 0
|
2月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
3月前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
51 3
|
4月前
|
搜索推荐 算法 Java
Java中的快速排序、归并排序和堆排序是常见的排序算法。
【6月更文挑战第21天】Java中的快速排序、归并排序和堆排序是常见的排序算法。快速排序采用分治,以基准元素划分数组并递归排序;归并排序同样分治,先分割再合并有序子数组;堆排序通过构建堆来排序,保持堆性质并交换堆顶元素。每种算法各有优劣:快排平均高效,最坏O(n²);归并稳定O(n log n)但需额外空间;堆排序O(n log n)且原地排序,但不稳定。
37 3
|
4月前
|
算法 搜索推荐 JavaScript
算法学习:快速排序
算法学习:快速排序
40 1
|
4月前
|
算法
数据结构与算法-快速排序
数据结构与算法-快速排序
22 1
|
3月前
|
算法 搜索推荐 C#
|
5月前
|
存储 搜索推荐 算法
快速排序算法详解
快速排序算法详解
|
4月前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
24 0
下一篇
无影云桌面