已知数组59、71、37、56、88、96、21、58、48、43 采用快速排序将数组有序。

快速排序同样采用了“分治策略”,使用递归的思路来实现算法。

快速排序的算法思想:

9、71、37、56、88、96、21、58、48、43   数组元素

0、1、   2、  3、  4、  5、  6、  7、  8、 9     数组下标

选取数组中某一个元素,使得元素左侧的数组元素都小于等于该元素数组右侧的元素都大于该元素.

例如选择元素 58 ,将数组按以上规则进行第一轮排序得

9、37、56、21、48、43、、88、96。

第一轮排序后满足上述规则。

第二轮将58左右两侧数组再次按上述规则进行排序。(采用递归的思想,直到数组不可分)

。。。。

根据以上思想得知:如何计算某一个元素非常重要,实际上计算这个元素的位置才是本质。这也是快速排序的核心。

快速排序的实现采用了“原址排序”。即在原数组中进行排序,与归并排序需要额外的空间相不同。

实现的思路为:将原数组分为3部分,小于等于某元素,某元素,大于某元素。

实现过程中 选取3个变量来表示数组对应的下标,从而实现三部划分。接下来采用java实现,在代码注释中在详解具体实现思路。

public class QuickOrder {

private int[] Array;

private int currentIndex;

private int maxIndex;

public QuickOrder(int size) {
                  this.Array = new int[size];
                  this.currentIndex = 0;
                  this.maxIndex = size-1;
          }

public void insert(int value) {
                  if(this.maxIndex<this.currentIndex) {
                         System.out.println("数组已满");
                  }else {
                        this.Array[this.currentIndex++] = value;
                  }
          }
          //开始进行排序
          public void quickOrder() {
                   this.order(0, this.currentIndex-1);//传入数组起始下标,与最后一个元素下标。
           }

private void order(int start,int end) {
                  if(start<end) {//递归条件,起始下标小于最后一个元素下标,即数组有不止一个元素。
                      int position = this.position(start, end); //计算某一元素的位置
                      this.order(start, position-1);//将左侧继续递归进行排序。
                      this.order(position+1, end);//将右侧继续递归进行排序。
                  }
          }

private int position(int start,int end) {
                  int minIndex = start-1;//作为小于等于部分的数组下标。
                  int moveIndex = start;//作为一个指针移动,且 minIndex与moveIndex之间的元素为大于部分
                  int aim = this.Array[end];//这里选择数组最右侧元素作为某一元素,这是快速排序其中一种简单实现,在后续文章中,将会有对某一元素选取的优化。
                  while(moveIndex<=end-1) {
                          if(this.Array[moveIndex]<=aim) {//如果元素小于目标值,将此元素放入0到minIndex部分中,同时minIdex加1(在满足条件之前,0到moveIndex之前的元素均已满足大于aim,所以当满足条件时,只需将不满足元素与之前满足的元素进行交换即可)。
                               minIndex = minIndex+1;
                               this.exchange(moveIndex, minIndex);
                           }
                          moveIndex++;//同时指针向后移动
                 }
                 this.exchange(minIndex+1, end);//最后将目标值,移动到小于等于部分与大于部分之间
                 return minIndex+1;//返回目标值的数组小标
         }
         //执行交换
          private void exchange(int x,int y) {
                  int temp = this.Array[x];
                  this.Array[x] = this.Array[y];
                  this.Array[y] = temp;
          }

public void show() {
                  for (int i : Array) {
                       System.out.println(i);
                  }
           }
}

快速排序的平均运行时间为O(NlgN),最坏运行情况为O(N²)。与数组情况以及某一元素的选取有关。将在以后文章中讲述其优化。

最终排序结果为: 21、37、43、48、56、58、59、71、88、96

快速排序(一) 思想 JAVA实现的更多相关文章

  1. 让你一看就懂的快速排序算法(Java)

    快速排序 你也许会被快速排序的文章弄得迷迷糊糊,其实大体上去看,快速排序就一步:找个数做基准数,把小于它的数移到它左边,把大于它的数移到它右边.这句话是核心.然后我们只需要让基准数左边的重复上面的步骤 ...

  2. 基本算法思想Java实现的详细代码

    基本算法思想Java实现的详细代码 算法是一个程序的灵魂,一个好的算法往往可以化繁为简,高效的求解问题.在程序设计中算法是独立于语言的,无论使用哪一种语言都可以使用这些算法,本文笔者将以Java语言为 ...

  3. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  4. 排序算法之快速排序的思想以及Java实现

    1 基本思想 快速排序是在冒泡排序的基础上改进而来的,它是基于分治的思想.通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据 ...

  5. 快速排序基本思想,递归写法,python和java编写快速排序

    1.基本思想 快速排序有很多种编写方法,递归和分递归,分而治之法属于非递归,比递归简单多了.在这不使用代码演示.下面我们来探讨一下快速排序的递归写法思想吧. 设要排序的数组是A[0]……A[N-1], ...

  6. 快速排序原理及Java实现

    1.基本思想: 快速排序是我们之前学习的冒泡排序的升级,他们都属于交换类排序,都是采用不断的比较和移动来实现排序的.快速排序是一种非常高效的排序算法,它的实现,增大了记录的比较和移动的距离,将关键字较 ...

  7. 快速排序算法(Java)

    快速排序算法的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序. class Parti ...

  8. 快速排序及优化(Java实现)

    普通快速排序 找一个基准值base,然后一趟排序后让base左边的数都小于base,base右边的数都大于等于base.再分为两个子数组的排序.如此递归下去. public class QuickSo ...

  9. 插入排序 思想 JAVA实现

    已知一个数组 60.28.41.39.6 .18 .14.28.49.31 利用插入排序算法进行排序 插入排序是一个运行时间为O(N²)的排序算法. 算法思想  60.28.41.39.6 .18 . ...

随机推荐

  1. windows网络服务之配置网络负载均衡(NLB)群集

    O首页51CTO博客我的博客 搜索 每日博报 社区:学院论坛博客下载更多            登录注册 家园 学院 博客 论坛 下载 自测 门诊 周刊 读书 技术圈 曾垂鑫的技术专栏 http:// ...

  2. Sprint + mybatis 编写测试

    今天使用Spring 和mybatis框架编写项目,写了个测试方法方便测试,之前因为一直报空指针,注入不了,所以简单记录一下,方便以后使用 root.xml <?xml version=&quo ...

  3. solrCloud选举leader的逻辑分析

    First call *setup(ElectionContext) to ensure the election process is in it'd.    Next calljoinElecti ...

  4. poj2104 主席树模板题

    题意 给出n个数字组成的数字序列,有m组询问.每次询问包含三个数字l,r,k.对于每个询问输出序列区间[l,r]中第k大的数字. 分析 这是主席树的模板题,套板子就可以 #include <cs ...

  5. Chrome,firefox,ie等浏览器空格&nbsp;宽度不一样

    方案一:使用其他字符代替空格 使用(&nbsp:)空格浏览器之间,显示的不一样,对不齐等现象. 解决方案: 用半角空格&ensp:或者全角空格&emsp:就可以了,&e ...

  6. Windows Cmder

    一.简介 作为一个程序员,即使是在windows工作环境,cmd也是我们必不可少的使用工具.cmder 是为 Windows 提供的一个便携式控制台仿真器,用来替代windows的cmd,使用非常简单 ...

  7. Java基础语法(二)<运算符>

    运算符: 下面的都是相关的练习: 1.键盘录入一个三位整数数,请分别获取该三位数上每一位的数值 import java.util.Scanner; public class Test02 { publ ...

  8. javascript总结1:js常见页面消息输出方式 alert confirm console prompt document

    .1 js常见的输出方法: 1-1 alert 警告框 alert("js语法总结"); 1-2 confirm 确认方法 confirm("js语法总结"); ...

  9. Head First Python之人人都爱列表(1-初识Python)

    IDLE 内置函数==BIF==built-in function 默认地,内置函数都是紫色,字符串是绿色,关键字是橙色. tab:自动补全 Alt-P:前一个 Alt-N:下一个 列表的特性 列表看 ...

  10. 一张图看懂ASP.NET MVC5认证和授权过滤器的执行顺序

    IAuthenticationFilter是MVC5中的新特性,它有2个关键方法: OnAuthentication OnAuthenticationChallenge 当IAuthenticatio ...