快速排序的Java和python实现,亲测实际可用
1.基本思想
快速排序每趟排序确定一个元素x的位置,使用的方式是 将大于元素x的值放大x的右边,小于元素x的值放大x的左边。当确定x的位置之后,再分别对x左边的数组和右边的数组进行快速排序即可。
2.算法实现
这里我使用的是递归的方法。
假设先取数组第一个元素为x,同时设i,j分别指向数组头部和数组尾部,即i=0,j=length(arr)-1;因为x取得第一个元素,所以最开始i所指向的位置即x的位置。
先从尾部j指向的元素开始比较,只要j指向的元素大于x,j便向前移一位;一旦j指向的元素小于x,就将j指向的元素放在当前x所在的位置(即当前i指向的位置),此时可以当做x目前处于j所指向的位置。然后将x与i所指向的元素进行比较,只要i指向的元素小于x,i便向后移动一位;一旦i指向的元素大于x,就将i指向的元素放在当前x所在的位置(即当前j所指向的位置),此时可以将x的位置认为是i指向的位置。不断循环,直到 i>=j。此时便找到了x最终的位置,即此时i,j所共同指向的位置。再将x的值填到这个位置当中,便完成了一趟快速排序。
java的代码实现如下:因为初学java,这里使用方法的时候踩了几个坑,发现静态方法中不能调用非静态成员,后来把sort改为非静态方法
public class QuickSort {
public static void main(String args[]) {
int arr[] = {6,2,10,3,8,9};
QuickSort sorter = new QuickSort();
int m = 0, n = arr.length - 1;
sorter.sort(arr, m, n);
}
public void sort(int arr[], int m, int n) {
if(m < n) {
int x = arr[m];//每次确定位置的数组元素
int i = m, j = n;
while(i < j) {//快速排序的核心,将大于x的值全放大x的右边,小于的全放在左边
while(i < j && x < arr[j]) {
j--;
}
if(x > arr[j]) {//如果j指向的数小于x,则放到x左边;if条件以防止循环因i>=j终止
arr[i] = arr[j];
}
while(i < j && x > arr[i]) {
i++;
}
if(x < arr[i]) {//如果i指向的数大于x,则放大x右边
arr[j] = arr[i];
}
}
arr[i] = x;
showArray(arr);
sort(arr, m, i-1);//对左边的部分进行快速排序
sort(arr, i+1, n);//对右边的部分进行快速排序
}
}
public void showArray(int arr[]) {
for(int x:arr){
System.out.print(x+"、");
}
System.out.println("");
}
}
python 的代码实现如下
# -*- coding: utf-8 -*- def QuickSort(lista, m, n):
if m < n:
i = m
j = n
x = lista[i]
while i < j:#第一趟排序
while i < j and x < lista[j]:
j = j - 1
if x > lista[j]:
lista[i] = lista[j]
while i < j and x > lista[i]:
i = i + 1
if x < lista[i]:
lista[j] = lista[i]
lista[i] = x#确定x位置后,将x放入该位置
print(lista)
QuickSort(lista, m, i - 1)#递归处理左边部分
QuickSort(lista, i + 1, n)#递归处理右边部分
return lista if __name__ == '__main__':
listx = [6,2,10,3,8,9]
a = 0
b = len(listx) - 1
listb = QuickSort(listx, a, b)
print(listb)
最后其实发现,每趟排序中的j--,i++部分的循环体均可以使用if语句来达到目的,但是在网上看到的博客大家都是使用循环,如果有知道的朋友欢迎给我解答
快速排序的Java和python实现,亲测实际可用的更多相关文章
- Intellij IDEA 最新旗舰版注册激活破解(2018亲测,可用)
1.2017年亲测 参考:https://www.haxotron.com/jetbrains-intellij-idea-crack-123/ 安装IntelliJ IDEA 最新版 启动Intel ...
- java调用monkeyrunner(亲测绝对可行)
我自己试验了下和官方的API编写不太一样,老别扭了,建议还是用Python写吧 昨天在网上查了一下一天,都是转来贴别人的,真正敲的很少,我真不知道转的大侠你们自己敲了么? 先截一段不负责任的blog图 ...
- anaconda 安装2个python环境 亲测
本机环境: anaconda3,pyhon3.7.4 配置第2个python环境,安装python3.6 > conda create --name tensorflow python=3.6 ...
- spring mybatis 3.2调用mysql存储过程返回多结果集(完整、亲测、可用)
最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的. ...
- U盘变小恢复工具——亲测完美可用
大白菜U盘,装系统后,U盘损坏,格盘后8G只剩345M,用usbboot恢复到了2G容量.离8G还差很远.用U盘变小恢复工具后,完美恢复到原来大小.在此记录一下,以待下次遇到相似情况使用. 原文地址 ...
- sqlserver2000 数据库分页查询[根据网上搜索到得sql修改,亲测,可用]
SELECT TOP 页大小 * FROM TestTable WHERE (ID > (SELECT case when count(0) < 页大小 then 0 else MAX(i ...
- Kali更新源,亲测目前可用的源
kali更新的时候老是无法定位软件包,网络上大部分中科大.阿里云kali源都不可用,都千篇一律,最后找了这个,网易的,还不错,贴出来大家看看: # 源 deb http://mirrors.163.c ...
- Swagger Liunx环境搭建(亲测百分百可用)
一.安装nodejs 下载编译好的nodejs安装包,下载地址: https://nodejs.org/dist/v10.10.0/ (作者下载的10.10.0,可根据自己需要下载不同版本) 将下载好 ...
- Caffe初学者第一部:Ubuntu14.04上安装caffe(CPU)+Python的详细过程 (亲测成功, 20180524更新)
前言: 最近在学习深度学习,最先要解决的当然是开源框架的环境安装了.之前一直在学习谷歌的Tensorflow开源框架,最近实验中需要跟别人的算法比较,下载的别人的代码很多都是Caffe的,所以想着搭建 ...
随机推荐
- ActiveMQ_7JMX
activemq配置jmx 配置activemq中的jmx可以用于监控activemq信息. activemq.xml配置 修改broker属性 添加节点managementContext <m ...
- (PMP)第11章-----项目风险管理
11.1 规划风险管理 输入 工具与技术 输出 1.项目章程 2.项目管理计划 (所有组件) 3.项目文件 (相关方登记册) 4.事业环境因素 5.组织过程资产 1.专家判断 2.数据分析 (相关方分 ...
- 【repost】H5总结
1.新增的语义化标签: <nav>: 导航 <header>: 页眉 <footer>: 页脚 <section>:区块 <article> ...
- Python序列结构--列表(一)
列表 列表**包含若干元素的有序连续内存空间**,当列表增加或删除元素时,**列表对象自动进行内存的扩展或收缩**,从而**保证相邻元素之间没有缝隙**.但插入和删除非尾部元素时涉及列表元素大量的移动 ...
- ubuntu下chrome浏览器安装flash插件(pepperflashplugin-nonfree)
安装前说明: ubuntu的Google 已经不能使用Adobe Flash了,需要用PepperFlashPlayer来替代 Adobe Flash才行. 安装步骤: 1.安装pepperflash ...
- shell 文件操作
序 在linux平台下开发,我们经常会接触到一些任务性质的工作,而处理方式多样化.现积累各个案例. 从远程服务器拉取文件到本地服务器 scp work@cp01-xx-dev.com: ...
- 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件
[源码下载] 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件 作者: ...
- 改善Python 程序的 91 个建议
建议1.理解Pythonic概念—-详见Python中的<Python之禅> 建议2.编写Pythonic代码 (1)避免不规范代码,比如只用大小写区分变量.使用容易混淆的变量名.害怕过长 ...
- 文件上传和WAF的攻与防
Author:JoyChouDate:20180613 1. 前言 本文的测试环境均为 nginx/1.10.3 PHP 5.5.34 有些特性和 语言及webserver有关,有问题的地方,欢迎大家 ...
- TextView展示富文本时emoj或图片和文字不对齐的解决方案
在项目中,回复框.聊天界面的显示往往会有emoj或者图片,但是一个比较头疼的问题是,会出现emoj表情或者图片和文字的位置不对齐,总是有偏移,这样很影响用户体验的.下面会总结一下如何解决这个问题. 本 ...