手写快速排序(java实现)

手写快速排序(java实现)

时间复杂度:

  O(nlogn)

快速排序原理:

  1. 定义一个基准元素base(我这里定义的是最左面的元素定位基准元素)
  2. 定义两个变量i和j
  3. j先从右向左遍历,找到第一个比base小的数就停止
  4. i再从左向右便利找到第一个比base大的数停止
  5. 交换i和j指向的元素
  6. 直到i和j指向同一个元素,将这个元素与基准元素交换
  7. 递归求解即可

图解:(排序过程)

 

注意:

  上图为第一次快速排序的过程,递归过程和上图一致(没有给出)

每一次的排序结果:

  现在在火车上没有给出具体每次排序结果,回学校补上.

Java代码实现:

package cn.csuft.poorguy.struct;

public class quickSortText {
	public static void main(String[] args) {
		int[] arr = { 3, 4, 1, 2, 6, 9, 8, 5, 7 };
		quickSort(arr, 0, arr.length - 1);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
	}

	public static void quickSort(int[] arr, int left, int right) {

		//数组最左边小于最右边不合法,直接退出
		if (left > right) {
			return;
		}

		//定义变量i指向最左边
		int i = left;

		//定义变量j指向最右边
		int j = right;

		//定义左边为基准元素base
		int base = arr[left];

		//只要i和j没有指向同一个元素,就继续交换
		while (i != j) {

			//从右向左寻找第一个小于基准元素的数
			while (arr[j] >= base && i < j) {
				j--;
			}

			//从左向右寻找第一个大于基准元素的数
			while (arr[i] <= base && i < j) {
				i++;
			}

			//执行到这里证明找到了i和j指向的元素
			//交换i和j指向的元素
			int temp = arr[i];
			arr[i] = arr[j];
			arr[j] = temp;
		}

		//将i和j共同指向的元素与基准元素交换
		arr[left] = arr[i];
		arr[i] = base;

		//对左边进行快速排序
		quickSort(arr, left, i - 1);

		//对右边进行快速排序
		quickSort(arr, i + 1, right);
	}
}

  

原文地址:https://www.cnblogs.com/PoorGuy/p/10370588.html

时间: 2024-10-06 00:29:01

手写快速排序(java实现)的相关文章

爬虫入门 手写一个Java爬虫

本文内容 涞源于  罗刚 老师的 书籍 << 自己动手写网络爬虫一书 >> ; 本文将介绍 1: 网络爬虫的是做什么的?  2: 手动写一个简单的网络爬虫; 1: 网络爬虫是做什么的?  他的主要工作就是 跟据指定的url地址 去发送请求,获得响应, 然后解析响应 , 一方面从响应中查找出想要查找的数据,另一方面从响应中解析出新的URL路径, 然后继续访问,继续解析;继续查找需要的数据和继续解析出新的URL路径  . 这就是网络爬虫主要干的工作.  下面是流程图: 通过上面的流程图

关于java写一个单例类(面试手写题)

package com.shundong.javacore; /** * java写一个简单的单例类 * @author shundong * */ class Singleton { //使用一个类变量来缓存曾经创建的实例 private static Singleton instance; //对构造进行隐藏(private) private Singleton(){} /** * 提供一个静态方法 * 该方法加入了自定义控制 保证只产生一个Singleton对象 * @return 返回S

Java面试必备:手写单例模式

面试官:请手写下几种常见的单例模式 我:好的(面带微笑),心里暗喜(送分题). 没成想提笔便写出了如此豪放的代码,不堪回首,请原谅我的不羁! 此篇整理了几种常见的单例模式代码示例,再有面试官让手撕单例模式,便能心中有码,下笔有神. 为什么要有单例模式 实际编程应用场景中,有一些对象其实我们只需要一个,比如线程池对象.缓存.系统全局配置对象等.这样可以就保证一个在全局使用的类不被频繁地创建与销毁,节省系统资源. 实现单例模式的几个要点 首先要确保全局只有一个类的实例. 要保证这一点,至少类的构造器

wex5 实战 手写签名与上传

之前做过一个物流演示模块,有一个功能没做完,就是收件人收货后,可以手写签名并上传,替代传统纸张的签名.今天终于做完了. 一 效果演示: 后台图片上传成功 二 设计思路: 运用canvas插件jq-signature,制作手写签名,并通过二进制流方式上传图片 三 代码实现: 1 .下载引入插件jq-signature 手写签名插件,网上有很多,经过多种插件的逐步尝试,只有插件jq-signature达到了我想要的效果; 原因有二:1,支持手机触摸,web,鼠标.其它有的不支持手机触摸. 2,直接转

写给java初学者

写给java初学自学者(一) 开篇直奔主题,java学习个人感觉分为两种途径,第一种是在学校,在培训机构等地方学习,有人指导;第二种是自学,通过视频,书籍,朋友等完成学习. 本文适合 自学,且基础薄弱或者无基础的人. 下面先就几个常见问题做个问答式讲解: 1. 学java需要基础吗?学java需要英语什么水平? 当你问这些问题前,首先要给自己一个定位.你学java是用来干什么的? 如果你只是想找个这方面的工作,进入这个个行业,那么没有基础,英语水平一般(例如public static void

手写数据库连接池

  1.  相信很多人看这篇文章已经知道连接池是用来干什么的?没错,数据库连接池就是为数据库连接建立一个"缓冲池",预先在"缓冲池"中放入一定数量的连接欸,当需要建立数据库连接时,从"缓冲池"中取出一个,使用完毕后再放进去.这样的好处是,可以避免频繁的进行数据库连接占用很多的系统资源.      2.  常见的数据库连接池有:dbcp,c3p0,阿里的Druid.好了,闲话不多说,本篇文章旨在加深大家对连接池的理解.这里我选用的数据库是mysql

手写Maven的archetype项目脚手架

一.背景 maven是一个很好的代码构建工具,采用“约定优先于配置”的原则进行项目管理,相信很多的java开发者应该都了解maven并可能在工作当中都是通过maven来管理项目的,在创建的项目的时候,我们往往会使用maven内置的项目骨架也就是archetype来快速生成项目结构.但是在一个团队做开发的过程中,可能仅仅依靠maven预先提供的archetyp可能是不够的,团队之间协作有自己的定义方式,每个人的结构定义风格也不尽相同,在这样的背景下我们有必要去定义一个统一的代码骨架供团队使用,这样

第6章 识别手写字体

前言 神经网络是一种很特别的解决问题的方法.本书将用最简单易懂的方式与读者一起从最简单开始,一步一步深入了解神经网络的基础算法.本书将尽量避开让人望而生畏的名词和数学概念,通过构造可以运行的Java程序来实践相关算法. 关注微信号"javaresearcher"来获取本书的更多信息. 这一章节我们将会解决一个真正的问题:手写字体识别.我们将识别像下面图中这样的手写数字. 在开始之前,我们先要准备好相应的测试数据.我们不能像前边那样简单的产生手写字体,毕竟我们自己还不知道如何写出一个产生

springmvc 动态代理 JDK实现与模拟JDK纯手写实现。

首先明白 动态代理和静态代理的区别: 静态代理:①持有被代理类的引用  ② 代理类一开始就被加载到内存中了(非常重要) 动态代理:JDK中的动态代理中的代理类是动态生成的.并且生成的动态代理类为$Proxy0 静态代理实例1.创建一个接口: package proxy; public interface People { public void zhaoduixiang()throws Throwable; } 2.创建一个实现类,张三,张三能够吃饭,张三可以找对象 package proxy;