快速排序算法图解分析

一、快速排序介绍

1.快速排序是对冒泡排序的改进。冒泡排序每次交换只能使原序列的逆序数减一(相邻元素的交换),而快速排序可以进行不相邻元素的交换,逆序数至少减少1。(当排序序列逆序数为0时,排序就完成了)

  • 百度百科的逆序数解释:
    在这里插入图片描述

2.基本思想(以升序排序为例):

  1. 选定数组中的一个数作为参照数,将比其小的数放在其左边,大的放在其右边。
  2. 将其左边和右边的数看成新的数组,分别进行第一步的过程,之后循环进行,直到新的数组中只剩一个元素为止。

二、图解

下图中只用看思想,排序过程中实际数的顺序不一定是这样的。这里选每个数组中第一个数当参照数,实际参照数可以有多种选择方案。
在这里插入图片描述

三、代码分析

3.1交换函数

快排中最重要就是将比参照数小的放在其左边,大的放在其右边的方法。这里我看了一些文章,结合自己的思考,总结了三个方法。

(1)一直交换

这里定义两个指针分别指向数组的头与尾。

a. 判断尾指针所在元素是否小于参照数(即头指针指向的数),不小于,尾指针就一直向左移,直到找到小于参照数的数或到达头指针(两指针相遇,循环就结束),将头尾指针元素交换。

b.接着判断头指针所在元素是否大于参照数(即尾指针指向的数),不大于,头指针就一直向右移,直到找到大于参照数的数或到达尾指针(两指针相遇,循环就结束),将头尾指针元素交换。

c.反复进行步骤ab,直到头尾指针相遇。

**思考:**这样可以保证头指针前的都是小于参照数的,尾指针后的都是大于参照数的。

图解:
这里以arr={5, 4, 8, 2, 7, 1}为例
在这里插入图片描述
尾指针小于5,交换。(一定要尾指针先判断,因为头指针记录着参照数。)
在这里插入图片描述
头指针开始判断:
在这里插入图片描述
找到,交换。
在这里插入图片描述
尾指针开始判断。
在这里插入图片描述
找到,交换。
在这里插入图片描述
头指针开始判断。
在这里插入图片描述
两指针相遇,结束。
代码:

public static int  change(int[] arr, int left, int right) {
   
        int l = left;//头指针
        int r = right;//尾指针
        while(l < r){
   
            while(arr[r] >= arr[l] && l < r){
   
                r--;
            }
            int temp = arr[r];//交换
            arr[r] = arr[l];
            arr[l] = temp;

            while(arr[l] <= arr[r] && l < r){
   
                l++;
            }
            temp = arr[r
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 当然可以。 快速排序算法(Quick Sort)是一种排序算法,是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 基本步骤: 1. 从数列中挑出一个元素,称为“基准”(pivot), 2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。 快速排序的时间复杂度为O(nlogn)。 示例代码(使用递归实现): ``` def quick_sort(arr, left, right): if left >= right: return pivot = arr[left] l, r = left, right while l < r: while l < r and arr[r] ### 回答2: 当然可以帮您写一个快速排序算法的教案。下面是一个简单的教案示范: 标题:快速排序算法教案 目标:介绍快速排序算法的原理及实现步骤,帮助学生掌握快速排序的基本思想和算法实现。 教学内容: 1. 引入快速排序算法的概念和背景,介绍其在实际应用中的重要性和优点。 2. 解释快速排序算法的基本原理: - 选择一个基准元素(pivot),将待排序数组分成两个子数组。 - 将小于基准元素的元素放在左侧子数组,将大于基准元素的元素放在右侧子数组。 - 对左右子数组递归地进行快速排序,直到排序完成。 3. 用示例图解说明快速排序算法的执行过程,让学生理解其分治策略和递归调用。 4. 根据算法原理,给出快速排序算法的伪代码: - 定义函数 quicksort(arr, low, high): - 如果 low < high: - 设置基准元素 pivot = arr[high] - 设置划分点 i = low - for j 从 low 到 high-1: - 如果 arr[j] < pivot: - 交换 arr[i] 和 arr[j] - i++ - 交换 arr[i] 和 arr[high] - 递归调用 quicksort(arr, low, i-1) - 递归调用 quicksort(arr, i+1, high) 5. 介绍优化和改进的快速排序算法,如随机选择基准元素、三数取中等。 6. 分析快速排序的时间复杂度和空间复杂度,引导学生思考其优缺点以及适用场景。 7. 给出一个能够测试快速排序算法正确性的案例,并让学生通过手动执行算法来验证结果。 8. 布置练习,要求学生独立编写快速排序算法的代码,并对已知数据进行排序实践。 9. 总结快速排序算法的特点和应用范围,鼓励学生深入学习和探索其它算法。 ### 回答3: 当然可以帮您写一个快速排序算法的教案。快速排序是一种常用且高效的排序算法,其基本思想是通过分治的思想将一个待排序的数组分成两个子数组,再对子数组分别进行排序,最终将这些子数组合并成一个有序的序列。 教案的步骤如下: 1. 引入快速排序的概念和背景,并解释快速排序的优点和适用场景。 2. 介绍快速排序的基本思想和算法流程: - 选择一个基准元素(通常选择第一个元素)作为分界点。 - 将比基准元素小的元素移动到基准元素的左边,将比基准元素大的元素移动到右边。 - 对左右两个子数组递归地调用快速排序算法。 3. 使用伪代码或具体的代码示例演示快速排序算法的实现过程,包括递归调用和基准元素的选取。 4. 分析算法的时间复杂度,并解释快速排序的优化方式,如随机选取基准元素或三数取中法。 5. 通过实际例子演示快速排序算法的操作步骤和排序结果。 6. 对比快速排序和其他排序算法(如冒泡排序、插入排序等)的优缺点和性能,并讨论快速排序的应用场景。 7. 提供一些练习题,供学生巩固和深入理解快速排序算法。 在教学中,可以适当地加入一些图示,以便让学生更好地理解算法的执行过程。另外,可以结合编程实践,让学生通过实际编写代码来实现快速排序算法,进一步提高他们的理解和应用能力。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值