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实现,亲测实际可用的更多相关文章

  1. Intellij IDEA 最新旗舰版注册激活破解(2018亲测,可用)

    1.2017年亲测 参考:https://www.haxotron.com/jetbrains-intellij-idea-crack-123/ 安装IntelliJ IDEA 最新版 启动Intel ...

  2. java调用monkeyrunner(亲测绝对可行)

    我自己试验了下和官方的API编写不太一样,老别扭了,建议还是用Python写吧 昨天在网上查了一下一天,都是转来贴别人的,真正敲的很少,我真不知道转的大侠你们自己敲了么? 先截一段不负责任的blog图 ...

  3. anaconda 安装2个python环境 亲测

    本机环境: anaconda3,pyhon3.7.4 配置第2个python环境,安装python3.6 > conda create --name tensorflow python=3.6 ...

  4. spring mybatis 3.2调用mysql存储过程返回多结果集(完整、亲测、可用)

    最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的. ...

  5. U盘变小恢复工具——亲测完美可用

    大白菜U盘,装系统后,U盘损坏,格盘后8G只剩345M,用usbboot恢复到了2G容量.离8G还差很远.用U盘变小恢复工具后,完美恢复到原来大小.在此记录一下,以待下次遇到相似情况使用. 原文地址 ...

  6. sqlserver2000 数据库分页查询[根据网上搜索到得sql修改,亲测,可用]

    SELECT TOP 页大小 * FROM TestTable WHERE (ID > (SELECT case when count(0) < 页大小 then 0 else MAX(i ...

  7. Kali更新源,亲测目前可用的源

    kali更新的时候老是无法定位软件包,网络上大部分中科大.阿里云kali源都不可用,都千篇一律,最后找了这个,网易的,还不错,贴出来大家看看: # 源 deb http://mirrors.163.c ...

  8. Swagger Liunx环境搭建(亲测百分百可用)

    一.安装nodejs 下载编译好的nodejs安装包,下载地址: https://nodejs.org/dist/v10.10.0/ (作者下载的10.10.0,可根据自己需要下载不同版本) 将下载好 ...

  9. Caffe初学者第一部:Ubuntu14.04上安装caffe(CPU)+Python的详细过程 (亲测成功, 20180524更新)

    前言: 最近在学习深度学习,最先要解决的当然是开源框架的环境安装了.之前一直在学习谷歌的Tensorflow开源框架,最近实验中需要跟别人的算法比较,下载的别人的代码很多都是Caffe的,所以想着搭建 ...

随机推荐

  1. 20170805_Elasticsearch_简介和安装

    官网地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html Elk 是一个可高 ...

  2. 解决win10系统无法安装.NET Framework 3.5

    方法1:“我的电脑”,单击右键选择“管理” 在打开的“计算机管理”窗口中依路径“服务和应用程序—服务”打开,在列表中找到“Windows Update”并双击打开. 启动类型:自动. 服务状态下面点击 ...

  3. SQL SERVER中LIKE在Char和nChar输出结果不一致解惑

    一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...

  4. 走进JDK(八)------AbstractSet

    说完了list,再说说colletion另外一个重要的子集set,set里不允许有重复数据,但是不是无序的.先看下set的整个架构吧: 一.类定义 public abstract class Abst ...

  5. app已损坏,打不开。你应该将它移到废纸篓

    首先声明: 有可能并非你安装的软件已损坏,而是Mac系统的安全设置问题,因为这些应用都是破解或者汉化的,那么解决方法就是临时改变Mac系统安全设置. 出现这个问题的解决方法: 修改系统配置:系统偏好设 ...

  6. shell脚本学习-执行

    跟着RUNOOB网站的教程学习的笔记 Shell与Shell脚本 Shell是用户与Linux系统的桥梁.它既是一种命令语言,也是一种程序设计语言. Shell脚本是一种Shell编写的脚本程序,其实 ...

  7. Ubuntu 14.04 LTS 初装成

    原先博客放弃使用,几篇文章搬运过来 Windows 7下使用win32diskimager 制作启动盘,安装Ubuntu OS安装完成后,安装DrclientLinux. 安装搜狗输入法 Linux下 ...

  8. delphi如何在form显示出来后处理指定的事件(例如自动登录)

    最近写一个delphi客户端,遇到一个自动登录问题,已经解决了思路如下: 1.在Form的oncreate事件中读取用户配置文件,检查及处理是否保存了用户密码,是否自动登录,如果需要自动登录, 自动登 ...

  9. word文档的python解析

    主要两块,第一个是文件类型的转换,第二个是用docx包去对word文档中的table进行parse 1. 文件格式装换 因为很多各种各样的原因,至今还有一些word文档是doc的格式存的,对于这种,如 ...

  10. 第六节:详细讲解Java中的装箱与拆箱及其字符串

    前言 大家好,给大家带来详细讲解Java中的装箱与拆箱及其字符串的概述,希望你们喜欢 装箱与拆箱 封装类有:Byte , short , Integer , Character , long , Fl ...