快速排序算法

简介: 快速排序算法

步骤: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);//递归方式对基数右边的数进行排序
    }
}
相关文章
|
1月前
|
搜索推荐 C语言
【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)
本文介绍了快速排序的升级版——三路快排。传统快速排序在处理大量相同元素时效率较低,而三路快排通过将数组分为三部分(小于、等于、大于基准值)来优化这一问题。文章详细讲解了三路快排的实现步骤,并提供了完整的代码示例。
55 4
|
21天前
|
存储 搜索推荐 Python
用 Python 实现快速排序算法。
快速排序的平均时间复杂度为$O(nlogn)$,空间复杂度为$O(logn)$。它在大多数情况下表现良好,但在某些特殊情况下可能会退化为最坏情况,时间复杂度为$O(n^2)$。你可以根据实际需求对代码进行调整和修改,或者尝试使用其他优化策略来提高快速排序的性能
115 61
|
2月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
32 1
|
2月前
|
搜索推荐 Java Go
深入了解快速排序算法
深入了解快速排序算法
51 2
|
2月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
2月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
33 0
|
2月前
|
搜索推荐 C语言 C++
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
【C语言】指针篇-精通库中的快速排序算法:巧妙掌握技巧(4/5)
|
4月前
|
搜索推荐 算法 Java
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
该博客文章通过UML类图和Java源码示例,展示了如何使用适配器模式将QuickSort类和BinarySearch类的排序和查找功能适配到DataOperation接口中,实现算法的解耦和复用。
51 1
现有一个接口DataOperation定义了排序方法sort(int[])和查找方法search(int[],int),已知类QuickSort的quickSort(int[])方法实现了快速排序算法
|
4月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
5月前
|
算法 搜索推荐 编译器
算法高手养成记:Python快速排序的深度优化与实战案例分析
【7月更文挑战第11天】快速排序是编程基础,以O(n log n)时间复杂度和原址排序著称。其核心是“分而治之”,通过选择基准元素分割数组并递归排序两部分。优化包括:选择中位数作基准、尾递归优化、小数组用简单排序。以下是一个考虑优化的Python实现片段,展示了随机基准选择。通过实践和优化,能提升算法技能。**
65 3