排序算法可视化系列——篇四“快速排序”
快速排序
基本思想分析:
我们前面介绍的算法相比现在要说的快速排序来说在大数组的性能方面较差,
快速排序是采用一种分治策略,稍微说一下什么是分治策略,我们之前使用递归时,
是将问题分解为更小规模的同类问题进行处理,最后将结果综合起来,而分治的思
想是同样将问题拆为更小规模,但是小规模问题的解法可能完全不同,所以将这些
不同的小问题结果组织起来形成原始问题的解,这就是分治策略。我们在进行快速
排序就是使用分治的策略,具体如下:
我们在无序数组中选取一个元素称为主元,一般简单的选取方法是选择数组的
最后一个元素,但是如果需要精益求精,那么我们就不能这么选取主元,后面再说
选取主元的问题,选取主元后,我们对数组从第一位元素开始进行遍历,直到数组
的倒数第二个元素(因为此时最后一个元素为主元),在遍历过程中我们需要比较
此时位置元素与主元元素的大小,然后进行交换(具体和谁进行交换看下面算法描
述),如果大于主元元素,则不做任何操作,最后遍历结束,我们将主元元素与其
它元素中的一个交换位置,使得交换位置后满足:
-
主元元素左边的元素均不大于主元元素
- 主元元素右边的元素均大于主元元素
那么我们知道主元元素其实已经处于自己排好序的正确位置,这样我们就可以称为
进行了一次划分,然后我们再对从起始到主元元素之前的子数组进行递归调用快速
排序,对主元元素后面的子数组同样调用快速排序,这样就可以将数组排好序。
算法描述:
//首先进行递归调用的快速排序(假设对简单整型数组)
public static void QuickSor(int[] ar , int start , int end){
if(end > start){
int mid = merge(ar,start,end);//调用划分方法,得到主元位置
进行递归调用
QuickSort(ar,start,mid - 1);
QuickSort(ar,mid + 1,end);
}
}
//对数组进行划分的方法,返回最后主元的位置
private int merge(int[] ar, int start, int end){
声明一个变量作为主元元素,值为数组中最后一个元素
声明一个变量index = -1记录小于主元元素的位置索引,因为还没有比较所以设为-1
for(进行循环,遍历数组,直到倒数第二个元素){
比较此刻元素与主元元素的大小
如果小于主元元素,则把index自增1然后将位置index元素与此刻元素交换
如果大于,则不进行任何操作
}
最后将主元元素与++index位置的元素进行交换
保证了,在index之前的子数组元素均小于主元,而在之后的均大于主元
return index;
}
从上面可以看出我们类似的对数组进行二分,而且事实证明每次如果可以将两个子数组
划分的大小接近相同,此时的时间复杂度最小,所以直到需要分的时间复杂度为O(log(n)),
而每次度需要迭代进行O(n),所以整个快速排序的时间复杂度为O(n * log(n)),这还是在理
想情况下,即两个子数组接近相等,但是事实证明它平均时间复杂度即为O(n * log(n)),但是
如果遇到比较坑爹的事的话,比如每次分了以后,都有一个子数组为空,那么另外一个就是
n-1,那么时间复杂度就是O(n^2),其实这与开始如何选取主元有关系。
算法的Java基本实现:
/** * 快速排序的Java简单实现 * 基于对整型数组的简单实现 * */ public class QuickSort{ public void quickSort(int[] a,int start,int end){ if(end > start){ /** * 调用进行划分的方法,返回主元的索引 */ int mid = partition(a,start,end); /** * 递归调用,进行排序 */ quickSort(a,start,mid - 1); quickSort(a,mid + 1,end); } } /** * 进行划分的方法 */ public static int partition(int[] a,int start,int end){ int values = a[end];//进行划分的主元 int i = start - 1;//用于记录小于主元values值的索引 for(int j = start; j < end; j++){ if(a[j] < values){ i = i + 1; int temp_data = a[i]; a[i] = a[j]; a[j] = temp_data; } } /** * 最后移动主元,使得主元元素左边的元素小于等于主元 * 右边元素大于等于主元 */ for(int k = end - 1; k > i; k--){ a[k + 1] = a[k]; } a[i + 1] = values; return i + 1; } }
下面是关于快速排序的动态演示:
一、排序中。。。。。。
二、排序中。。。。。。
三、排好序。
上面就是对于快速排序的动态演示,下面附录的了这一部分的源代码:
相关推荐
在本系列的“算法可视化”中,我们将深入探讨插入排序的实现及其在实际编程中的应用。 **一、插入排序的基本概念** 插入排序是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入...
- 在实际编程中,更高效的排序算法如快速排序、归并排序等更为常用。 在`AlgorithmBubleSort.java`中,我们还可以探讨代码的可读性、空间复杂度以及可能的优化措施,例如使用双指针法减少不必要的比较。这些都将是...
希尔排序(Shell Sort)是一种基于插入排序的快速排序方法,由Donald Shell于1959年提出。它的主要思想是将待排序的数据按照一定的间隔进行分组,然后对每组进行插入排序,随着间隔逐渐缩小,最后进行一次全排列,...
**选择排序**是一种简单直观的排序算法,它的工作原理如下:...在实际应用中,更高效的排序算法如快速排序、归并排序或堆排序等通常会优先考虑。然而,对于教学和理解排序算法的基本原理,选择排序是一个很好的起点。
在本文中,我们将深入探讨C#编程语言中的几种基本排序算法——冒泡排序、插入排序以及快速排序,并结合“C#简单的排序算法可视化程序”这一主题,了解如何将这些算法进行可视化展示。在这个Windows Forms应用程序中...
在这个“可视化展示快速排序算法实现效果”的项目中,开发人员使用了Qt库来创建一个交互式的图形用户界面,以便用户能够直观地看到快速排序的过程。Qt是一个跨平台的C++图形用户界面应用程序框架,它提供了丰富的UI...
《课程设计:算法可视化实现——探索数据结构的魅力》 在当今的计算机科学领域,数据结构与算法是不可或缺的基础,它们是编程的灵魂,是解决问题的关键。本课程设计的主题为“算法可视化实现”,旨在通过实践帮助...
本主题聚焦于“java线程应用——排序过程动态显示”,通过源码和示例程序来阐述如何利用线程来实时展示排序算法的动态过程。 首先,排序过程动态显示意味着我们将使用线程来逐个步骤地执行排序算法,同时更新用户...
1. 该程序为一个可以展示不同排序算法的排序过程动画,... 一共有三种排序方法——直接插入排序、直接选择排序和冒泡排序快速排序,; 3. 排序元素输入为手动输入; 4. 有进度条显示排序的进度; 5. IDE:Eclipse
《严蔚敏、吴伟民》数据结构配套可视化算法演示系统是针对计算机科学中的核心课程——数据结构设计的一款辅助教学工具。该系统以其强大的可视化功能,帮助学生和教师深入理解各种数据结构及其操作,使抽象的算法变得...
在本实验“实验2 排序算法动态演示”中,我们重点关注的是计算机科学中的核心算法——排序算法。排序算法是数据处理和计算机科学的基础,它主要用于整理无序的数据集合,使其按照特定规则(如升序或降序)排列。在这...
这种可视化教学方法对于初学者尤其有益,能帮助他们快速掌握各种排序算法的精髓。 三、关键算法介绍 1. 冒泡排序:通过重复遍历待排序的元素列表,依次比较并交换相邻元素,直到没有更多的元素需要交换,使得整个...
图片文件`1409193.png`, `1409190.png`, 和 `1409197.png`可能是用于辅助理解这些排序算法的可视化表示,例如展示排序过程中的元素移动或者时间复杂度对比图。 在实际应用中,我们通常会使用更高效的排序算法,如...
《算法可视化器——深入探索JavaScript实现》 在计算机科学领域,算法是解决问题的关键步骤,而算法可视化则是将这些抽象的计算过程转化为可见的图形展示,帮助我们更好地理解和学习算法。"算法可视化器"是一个利用...
本项目"**c#实现各个排序可视化**"显然是一个教学资源,旨在帮助学生理解并实践计算机科学中的核心概念——排序算法。通过可视化的方式,学习者可以更直观地看到排序过程,加深对各种算法的理解。 排序是计算机科学...
首先,我们来了解最基本的排序算法——冒泡排序。冒泡排序是一种简单直观的排序方法,它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要...
"数据结构经典算法动态演示"这部分内容可能是通过图形化方式帮助学习者直观地理解每个排序算法的过程,这种可视化教学方法能帮助开发者更好地把握算法逻辑,加深对算法运行效率的理解,对于初学者来说尤其有益。...
本文将深入探讨三种常见的排序算法——插入排序、希尔排序和快速排序,并介绍如何在MATLAB环境下进行仿真及统计它们的运算量。MATLAB是一种强大的数值计算和可视化工具,适合用于算法的开发和性能评估。 首先,我们...