快速排序(简单易懂)

一、快速排序的原理

1、在数组中选中一个数(哨兵),然后寻找该数(哨兵)在本数组中的合适位置,保证把该数(哨兵)放在寻找的位置后,数组左边的全部数比该哨兵的值小,数组右边的全部数值比该哨兵的值小(注意:左右的数并不是顺序排好,只是保证了和哨兵的大小位置)。

2、然后循环第一步的操作,保证全部数值到合适的位置。

二、快排实际演示

先任意选择一个无序数组。如下:

1、设置好数据,从数组右侧开始依次和哨兵大小对比,

     如果大于等于哨兵,向左挪动right(right--),

    如果小于哨兵,则把该位置的值交换到左侧left所在的位置,

    直到right和left重合

 移动如下:

2、第一次对比后交换位置后,然后从数组的左侧开始依次和哨兵大小对比,

如果小于等于哨兵,向右挪动left(left++)

如果大于哨兵,则把该位置的值设置到右侧right所在的位置,

直到right和left重合

移动如下:

3、第二次对比6和哨兵(key=3)的值,交换6到right所在的位置,

继续第一步操作

移动如下:

这时候发现left和right重合了,

重合的位置就是哨兵在该数组中的位置(此位置可以确保左边的数都比哨兵小,右边的数都比哨兵大)

设置后的数组如下

4、此时一轮循环已经结束,这时候以哨兵为分割线,分别把左右两半部分按照1-2-3-4步骤循环,最后得到的数组,

每个元素的位置都是最合适的位置,且完成了排序。

三、上代码

1、获取哨兵的合适位置:

//获取哨兵的合适位置
private static int getPickKey(int[] arr,int left,int right){
		//获取哨兵
		int  key = arr[left];
		while(left<right){
			while(arr[right]>=key && left<right )
				right --;
			arr[left]  = arr[right];
			while(arr[left] <=key && left<right )
				left ++;
			arr[right]  = arr[left];
		}
		arr[right] = key;
		return left;
	}

2、获取哨兵后,排序左右两部分

//获取哨兵位置后,分割左右,分别对左右两个数组再排序
private static void quickSort(int[]arr,int start,int end){
		if(start < end){
			int keyIndex = getPickKey(arr,start,end);
			quickSort(arr,0,keyIndex-1);
			quickSort(arr,keyIndex+1,end);
		}
	}

3、测试main

public static void main(String[] args) throws InterruptedException {
		int [] arr = {65,-2,99,6,8,12,35,24,108,62,31,-1,0,741,54};
		quickSort(arr,0,arr.length-1);
		for(int i = 0 ;i<arr.length;i++){
			System.out.print(arr[i]+",");
		}
	}

 

<think>嗯,用户想了解快速排序的通俗解释。首先,我需要回忆一下快速排序的基本原理。快速排序是分治算法的一种,对吧?分而治之,通过选择一个基准元素,把数组分成两部分,左边比基准小,右边比基准大,然后递归处理左右部分。这样每次排序后基准元素的位置就确定了,最终整个数组有序。 用户需要的是简单易懂的解释,所以得避免使用太多专业术语。比如,“基准元素”可以说成“参考点”或者“标杆”。可能需要用生活中的例子来比喻,比如整理书架,先选一本书作为基准,把其他书分到左右两边,左边是更小的,右边是更大的,然后对两边重复这个过程。 接下来,我得参考提供的引用内容。引用[1]提到快速排序的递归操作,引用[3]有Hoare法和挖坑法的不同方法,还有代码示例。引用[5]展示了Python和C++的代码,可能可以简化代码示例,用更直观的步骤说明。 用户可能对代码不太熟悉,所以重点放在步骤上。比如,选基准,分区,递归这三个步骤。需要强调分区的过程,即如何将元素移动到基准的两侧。可能用图示或者比喻更容易理解,比如把数组想象成一群人按身高排队,先选一个人,然后其他人按高矮分左右,再对左右的人重复这个过程。 还要注意时间复杂度,引用[4]提到平均情况是O(n log n),最坏是O(),但可以通过优化避免最坏情况,比如三数取中法选基准。不过用户可能暂时不需要优化细节,但可以简要提到优化方法,作为相关问题的扩展。 另外,引用[2]提到性能分析和优化方法,可以准备相关问题,比如性能分析、优化方法、应用场景等。确保回答结构清晰,分步骤说明,代码示例简洁,并且有相关问题引导深入学习。 现在组织结构:先定义快速排序,用比喻解释,分步说明,给出代码示例,再分析时间和空间复杂度,最后列出相关问题。注意使用中文,行内公式用$...$,独立公式用$$...$$,但用户的问题可能不需要太多公式,所以可能用自然语言描述。 检查是否有遗漏,比如稳定性,快速排序是不稳定的,这点可以提一下。应用场景如大数据量、无序情况,如引用[4]所说。这样用户能全面了解算法的特点和适用情况。</think>### 快速排序的通俗解释 快速排序是一种“分而治之”的高效排序算法,核心思路是**选基准、分左右、递归排**,类似于整理书架时选一本书为参考,将其他书按大小分到左右两侧,再对两侧重复操作[^1][^3]。 --- #### **三步理解快速排序** 1. **选基准** 从数组中任意选一个元素作为基准(如第一个元素、中间元素或随机选)。例如数组 `[5, 3, 8, 1, 2]`,选择中间元素 `3` 为基准。 2. **分左右** 将小于基准的元素移到左边,大于基准的移到右边。例如: $$[1, 2] \quad (基准=3) \quad [5, 8]$$ 3. **递归排** 对左右两边的子数组重复上述步骤,直到所有元素有序。 --- #### **Python代码示例** ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] # 选择中间元素为基准 left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` **代码说明**: - 递归终止条件:数组长度≤1时直接返回。 - 基准选择:这里选择中间元素(可改为随机选择优化性能)。 - 分区操作:用列表推导式将元素分到左、中、右三部分。 --- #### **性能特点** 1. **时间复杂度** - 平均情况:$O(n \log n)$,每次分区操作约减少一半问题规模[^4]。 - 最坏情况:$O(n^2)$(如数组已有序且基准总选边缘元素)。 2. **空间复杂度** - 递归栈深度平均为$O(\log n)$,最坏为$O(n)$[^4]。 3. **稳定性** - 快速排序是**不稳定排序**(相同元素可能交换位置)[^4]。 --- #### **应用场景** - **大数据量排序**:平均性能优于其他$O(n \log n)$算法(如归并排序)。 - **内存敏感场景**:原地排序版本(如Hoare分区法)节省内存[^3][^5]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值