首页 > 编程语言 >用Java实现快速排序

用Java实现快速排序

时间:2024-04-05 13:58:23浏览次数:32  
标签:Java int 基准 元素 数组 排序 快速 left

快速排序(Quick Sort)是一种分治的排序算法。

它的基本思想是:

  1. 选择一个基准元素(本文选择第一个元素)。
  2. 将数组中比基准小的元素放在基准的左边,比基准大的元素放在基准的右边。
  3. 对基准左边和右边的子数组分别进行快速排序。

快速排序的优点包括:

  1. 高效性:平均时间复杂度为O(nlogn)。
  2. 适用于各种数据类型。
  3. 空间复杂度相对较低。

然而,它也有一些缺点:

  1. 在最坏情况下,时间复杂度可能退化为。
  2. 对于小型数组,可能不太划算。

实现快速排序的步骤如下:

  1. 选择基准元素:本文选择数组中的第一个元素作为基准。则”指针“要从右侧向左侧移动
  2. 分割数组:当右侧向左扫描时,遇到比基准大的元素时,则继续向左扫描,当遇到比基准小的元素时,交换两”指针的元素“,然后从左侧开始向右侧扫描,重复如此。
  3. 最后,比基准小的元素将放在左边,比基准大的元素将放在右边。
  4. 递归地对左右子数组进行快速排序。

 

 代码演示如下:
public class Test2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int []ints=new int [] {23,-9,78,3,34,3,0,34,23};
		quickSort(ints,0,ints.length-1);
		System.out.println(Arrays.toString(ints));
	
		
	}
	//快速排序
	public static void quickSort(int[]arr,int left,int right) {
		
		//递归结束条件
		if(left>=right) {
		return;
		}
		//确定最左最右指针
		int l=left;
		int r=right;
		//与基准进行判断:这里选择左边第一个为基准即arr[left]
		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[l];
				arr[l]=temp;
			
			}
			//当出现比基准大的元素在基准的左边,或者比基准小的元素出现在基准的右边时,两个指针的元素进行交换
			else {
				int temp=arr[r];
				arr[r]=arr[l];
				arr[l]=temp;
				
			}
			
		}
		//递归调用
		quickSort(arr,left,l-1);
		quickSort(arr,r+1,right);
	}

}

快速排序是一种常用的排序算法,在许多情况下都能提供较好的性能。

标签:Java,int,基准,元素,数组,排序,快速,left
From: https://blog.csdn.net/2202_75433350/article/details/137398963

相关文章

  • JavaWeb学习笔记——第十五天
    Maven高级分模块设计与开发分模块设计就是将项目按照功能拆分成若干个子模块。优点:方便项目的管理维护、扩展,也方便模块间的相互调用,资源共享。分模块设计需要先针对模块功能进行设计,再进行编码实现。不会先将工程开发完毕,然后进行拆分。继承与聚合继承继承描述的是两个......
  • [附源码]JAVA计算机毕业设计二手母婴商品交易系统(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景近年来,随着人们生活水平的提高和育儿观念的转变,母婴商品市场逐渐繁荣起来。然而,传统的母婴商品交易方式往往存在信息不对称、价格不透明等问题,给消费......
  • [附源码]JAVA计算机毕业设计二手交易网站(源码+开题)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的快速发展和智能设备的普及,电子商务成为了现代人们购物的新宠。作为电子商务领域的一个细分市场,二手交易网站在近年来受到了广泛的关......
  • 九、算法-排序-堆排序
    常见六大排序:冒泡、选择、插入、快速、归并、堆。在了解堆排序之前,需要了解数据结构-二叉树的知识。二叉树:树中的每个节点下最多只有两个叶子节点;根节点:二叉树的首个节点;叶子节点:非根的节点;父节点-子节点:父节点下方归属的为子节点,是相对而言的关系,在顺序存储的数据结构里......
  • java自动化——web自动化复习
    之前复习整理: 模块1:https://www.cnblogs.com/xiaobaibailongma/category/1634188.html?page=3 模块2:https://www.cnblogs.com/xiaobaibailongma/category/1643583.html?page=5   =======================================================================   ......
  • Java基础_运算符和分支结构
    今天的内容1.运算符2.分支结构if-else1.运算符1.算术运算符2.关系运算符3.逻辑运算符1.1算术运算符自增和自减​目的:让变量自身加一或者减一语法格式:变量++;先执行当前的操作,然后自身再加1++变量;变量--;--变量;packagecom.qf.a_test;public......
  • 归并排序 返回逆序数 python
    defmerge_sort_and_count_inversions(arr):n=len(arr)ifn<=1:returnarr,0#如果n小于等于1,数组已经有序,直接返回数组本身和逆序数0mid=n//2left_lst,inv_left=merge_sort_and_count_inversions(arr[:mid])#对左半部分进行递......
  • Java中 for each循环
    Java中foreach循环是一种很强的循环结构,可以用来依次处理数组(或其他元素集合)中的每个元素,而不必考虑指定下标值。(优点就是显得更加简洁,更不容易出错)其格式为:for(element_typeelement:collection){//在此处执行针对element的操作}publicclassAa{publicst......
  • P2824 [HEOI2016/TJOI2016] 排序
    简要题意给定一个长度为\(n\)的排列\(a\),有\(m\)次操作:将\([l,r]\)从小到大排序将\([l,r]\)从大到小排序求\(m\)次操作后\(a_q\)的值。\(n,m\leq10^5\)思路首先这种排序的数据结构没有什么想法,根本原因是因为值太多了。但是我们观察到这是一个排列,这对于解......
  • java计算机毕业设计(附源码)影院订票app(ssm+mysql+maven+LW文档)
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在数字化时代,人们对于娱乐消费的方式和习惯正在发生着翻天覆地的变化。随着智能手机的普及以及移动互联网技术的飞速发展,线上订票系统成为了人们生活中不......