java 快速排序分析

news/2024/5/20 0:30:21 标签: java, 快速排序

快速排序

  1.实现

  2.复杂度

 

1.java 快速排序实现:

 

java">package com.sort;

import java.util.ArrayList;

public class QuickSort {
	private int getMiddle(ArrayList<Integer> list,int start,int end){
		int i = start;
		int j = end;
		Integer temp = list.get(start);//需要中间变量,或是每次替换时进行twiceswap
		while(i<j){
			while(temp<list.get(j)&&i<j)
				j--;
			if(i<j){
				list.set(i, list.get(j));
				i++;
			}
			while(list.get(i)<temp&&i<j)
				i++;
			if(i<j){
				list.set(j, list.get(i));
				j--;
			}
		}
		list.set(i, temp);//最后i=j
		return i;
	}
	
	private void quickSort(ArrayList<Integer> list,int start,int end){
		if(start<end){
			int middle = getMiddle(list, start, end);
			quickSort(list, start, middle-1);
			quickSort(list, middle+1, end);
		}
	}
	
	public void quickSort(ArrayList<Integer> list){
		this.quickSort(list, 0, list.size()-1);
	}
	
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		list.add(7);
		list.add(2);
		list.add(3);
		list.add(8);
		list.add(3);
		list.add(6);
		list.add(10);
		list.add(100);
		list.add(9);
		list.add(77);
		list.add(34);
		list.add(20);
		new QuickSort().quickSort(list);
		QuickSort.print(list);
	}
	
	public static void print(ArrayList<Integer> list){
		for (Integer integer : list) {
			System.out.print(integer+",");
		}
		System.out.println();
	}

}

1.实现中注意的事情,至少是我碰到的,需要一个中间变量进行比较,或是在交换的时候,进行两次交换,就是两个值互换位置 。可以尝试这样的用例100 77 34 20.

2.每一次的拆分,就已经确定了一个位置(并且将值分为两半,一半大,一半小),不要将middle也带入下一次的排序

 

 

2.快速排序复杂度分析:

 

快速排序的最佳情况:分割递归为平衡树,

这样分解次数为log2n

在第i次分解,需要比较n/(2^i)

通过运算推导

java">T(1) = 0;
T(n) <= 2T(n/2) + n;
T(n) <= 2(2T(n/4) + n/2) + n=4T(n/4)+2n
T(n) <= 8T(n/8)+3n
T(n) <= (log2n)^2T(1)+(log2n)n (因为分解log2n次)
T(n) <= nlog2n

 所以快速排序最佳复杂度为nlog2n

 

快速排序的最差情况:序列为正序或逆序,在分割后产生斜树,

这样要分解次数为n-1次,

在第i次分解后,需要比较n-i次

通过运算推导

java">n-1+n-2+n-3....+1=n(n-1)/2

 索引快速排序的最差复杂度为n^2

 

 

快速排序的平均复杂度:

设分解的关键字为k,则(1<=k<=n)

通过运算推导为nlogn

 

 

 

 

 

 


http://www.niftyadmin.cn/n/1695279.html

相关文章

linux系统管理学习(三)--工作管理

2.1 工作管理简介 2.2 工作管理办法 2.3 后端命令脱离中断 rc.local是一个系统文件&#xff0c;具体位置在 /etc/rc.local 系统每次开机的时候都会去执行该文件中的内容&#xff0c;、所以直接 vi /etc/rc.local 写入你的任务即可

SAP HANA 高可用性 (High Availability) 解决方案 (二) - Host Auto-Failover, 节点失效自动切换

SAP HANA完全支持系统高可用性的要求&#xff0c;对从简单的单点故障的自动恢复到严重的数据中心灾难恢复&#xff0c;都有完整的解决方案。 下面我们先谈谈对使用影响相对较小的故障恢复&#xff0c;SAP HANA支持三种解决方案&#xff0c;为了应对从低到高的故障程度分别如下…

正则表达式把数据库表的字段下划线分割单词批量替换成驼峰命名

1.数据库表设计一般都是下划线分割字段的&#xff0c;但是生成java实体类后是驼峰命名&#xff0c;怎么批量替换呢? 表本身字段说明 2.利用正则表达式匹配下划线和第一个字母&#xff0c;替换成驼峰 匹配字符串&#xff1a; _([\w]) 替换后的规则&#xff1a; \U\1\E 3.替换后…

R语言包安装并实现与HANA的整合

1 R语言介绍 R语言是基于S语言的一个GNU计划项目&#xff0c;可以当成是S语言的一种实现&#xff0c;最初是由新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发&#xff0c;主要用于统计分析&#xff0c;绘图&#xff0c;数据挖掘&#xff0e; SAP HANA SP5版本发布以来&a…

Linux系统管理学习(三)--系统资源查看

1 vmstat 命令监控系统 CPU数据处理速度&#xff1a;每秒150G以上&#xff1b;内存条&#xff1a;约1.6G/s硬盘&#xff1a;固态硬盘机械硬盘 300M/s——》缓存cache&#xff1a;从内存中拿出来的部分空间&#xff0c;用来加速数据从硬盘“读取”——》缓冲buffer&#xff1a;用…

Ganymed SSH-2 for Java系列5之删除远程服务器上的目录

删除远程服务器上的目录 同之前的说明&#xff0c;先在工具类中添加一个删除远程目录的方法 [java] view plaincopy/** * 删除远程服务器上的目录 * param host 主机ip * param username 登录用户名 * param password 登录密码 * param remoteDere…

ORM之练习

Django终端打应SQL语句 # 在Django项目的settings.py文件中&#xff0c;在最后复制粘贴如下代码&#xff1a; LOGGING {version: 1,disable_existing_loggers: False,handlers: {console:{level:DEBUG,class:logging.StreamHandler,},},loggers: {django.db.backends: {handle…

Oracle到SAP HANA实时复制系列(三):Replication Agent的安装与配置

引言 Oracle到SAP HANA实时复制系列(一)&#xff1a;初始SRS介绍了从Oracle到SAP HANA实时复制系统的体系架构&#xff0c;并阐述了数据实时复制过程。在Oracle到SAP HANA实时复制系列(二)&#xff1a;Replication Server的安装与配置文中结合截图一步步详细介绍了Replication…