快速排序的原理及java代码实现_java

概述

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(nlogn)次比较。事实上,快速排序通常明显比其他Ο(nlogn) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,并且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

快速排序,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,然后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

形象图示:

步骤

选择一个基准元素,通常选择第一个元素或者最后一个元素
通过一趟排序将待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的元素值均比基准值大
此时基准元素在其排好序后的正确位置
然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。

实例

原始数据:

3 5 2 6 2
选择 3 作为基准

第一轮

从右往左找比3小的,2符合,将2和3对调
2 5 2 6 3
对调一次,查找的方向反向,从左向右找比3大的,5符合,对调
2 3 2 6 5
再从右往左找比3小的,2符合,对调
2 2 3 6 5
一轮结束

第二轮

对 [2 2] 采用同上的方式进行,得到
2 2 3 6 5

第三轮

对 [6 5] 采用同上的方式进行,得到
2 2 3 5 6

最终结果

2 2 3 5 6

代码实现(Java)

package com.coder4j.main.arithmetic.sorting;

public class Quick {

 private static int mark = 0;

 /**
  * 辅助交换方法
  *
  * @param array
  * @param a
  * @param b
  */
 private static void swap(int[] array, int a, int b) {
  if (a != b) {
   int temp = array[a];
   array[a] = array[b];
   array[b] = temp;
   // 找到符合的,对调
   System.out.println("对调" + array[a] + "与" + array[b] + ",得到");
   for (int i : array) {
    System.out.print(i + " ");
   }
   System.out.println();
  }
 }

 /**
  * 新一轮分隔
  *
  * @param array
  * @param low
  * @param high
  * @return
  */
 private static int partition(int array[], int low, int high) {
  int base = array[low];
  mark++;
  System.out.println("正在进行第" + mark + "轮分隔,区域:" + low + "-" + high);
  while (low < high) {
   while (low < high && array[high] >= base) {
    high--;
    System.out.println("从右往左找比" + base + "小的,指针变动:" + low + "-" + high);
   }
   swap(array, low, high);
   while (low < high && array[low] <= base) {
    low++;
    System.out.println("从左往右找比" + base + "大的,指针变动:" + low + "-" + high);
   }
   swap(array, low, high);
  }
  return low;
 }

 /**
  * 对数组进行快速排序,递归调用
  *
  * @param array
  * @param low
  * @param heigh
  * @return
  */
 private static int[] quickSort(int[] array, int low, int heigh) {
  if (low < heigh) {
   int division = partition(array, low, heigh);
   quickSort(array, low, division - 1);
   quickSort(array, division + 1, heigh);
  }
  return array;
 }

 /**
  * 快排序
  *
  * @param array
  * @return
  */
 public static int[] sort(int[] array) {
  return quickSort(array, 0, array.length - 1);
 }

 public static void main(String[] args) {
  int[] array = { 3, 5, 2, 6, 2 };
  int[] sorted = sort(array);
  System.out.println("最终结果");
  for (int i : sorted) {
   System.out.print(i + " ");
  }
 }

}

测试输出结果:

全选复制放进笔记正在进行第1轮分隔,区域:0-4
对调2与3,得到
2 5 2 6 3
从左往右找比3大的,指针变动:1-4
对调3与5,得到
2 3 2 6 5
从右往左找比3小的,指针变动:1-3
从右往左找比3小的,指针变动:1-2
对调2与3,得到
2 2 3 6 5
从左往右找比3大的,指针变动:2-2
正在进行第2轮分隔,区域:0-1
从右往左找比2小的,指针变动:0-0
正在进行第3轮分隔,区域:3-4
对调5与6,得到
2 2 3 5 6
从左往右找比6大的,指针变动:4-4
最终结果
2 2 3 5 6

经测试,与实例中结果一致。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
快速排序
java实现快速排序、java实现快速排序算法、java快速排序原理、用java实现快速排序、快速排序java代码实现,以便于您获取更多的相关知识。

时间: 2024-07-30 15:05:03

快速排序的原理及java代码实现_java的相关文章

冒泡排序的原理及java代码实现_java

概述 冒泡排序是一种简单的排序算法.它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到数列已经排序完成.这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的开始. 简单点说,就是: 冒泡排序是將比較大的數字沉在数组的后面(可以理解为下面),较小的浮在前面(上面). 直观释义图: 步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元

快速排序算法原理及java递归实现_java

快速排序 对冒泡排序的一种改进,若初始记录序列按关键字有序或基本有序,蜕化为冒泡排序.使用的是递归原理,在所有同数量级O(n longn) 的排序方法中,其平均性能最好.就平均时间而言,是目前被认为最好的一种内部排序方法 基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列. 三个指针: 第一个指针称为pivotkey指针(枢轴),第二个指

归并排序的原理及java代码实现_java

概述 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的.然后再把有序子序列合并为整体有序序列. 归并排序采用的是递归来实现,属于"分而治之",将目标数组从中间一分为二,之后分别对这两个数组进行排序,排序完毕之后再将排好序的两个数组"归并"到一起,归并排序最重要的也就是这个"归并"的过程,归并的过程中需要额外的跟需要归并的两个数组长度一致的空间. 效果图: 步骤 申请空间,

新闻列表的分页查询java代码实现_java

本文实例为大家分享了新闻列表分页查询的java代码,供大家参考,具体内容如下 package com.ibeifeng.test; //创建新闻测试类 public class newTest { private long id; private String title; private String content; private String author; public newTest() { super(); } public newTest(long id, String titl

Java 快速排序(QuickSort)原理及实现代码_java

快速排序(QuickSort )是常用到的效率比较高的一种排序算法,在面试过程中也经常提及.下面就详细讲解一下他的原理.给出一个Java版本的实现. 快速排序思想: 通过对数据元素集合Rn 进行一趟排序划分出独立的两个部分.其中一个部分的关键字比另一部分的关键字小.然后再分别对两个部分的关键字进行一趟排序,直到独立的元素只有一个,此时整个元素集合有序. 快速排序的过程--挖坑填数法(这是一个很形象的名称),对一个元素集合R[ low ... high ] ,首先取一个数(一般是R[low] )做

细致解读希尔排序算法与相关的Java代码实现_java

希尔排序(Shell's sort)是一种非常"神奇"的排序算法.说它"神奇",是因为没有任何人能清楚地说明它的性能到底能到什么情况.希尔排序因DL.Shell于1959年提出而得名.自从C. A. R. Hoare在1962年提出快速排序后,由于其更为简单,一般采用快速排序.但是,不少数学家们还是孜孜不倦地寻找希尔排序的最佳复杂度.作为普通程序员,我们可以学习下希尔的思路. 顺便说一句,在希尔排序出现之前,计算机界普遍存在"排序算法不可能突破O(n2)&

Log4j定时打印日志及添加模块名配置的Java代码实例_java

配置间隔时间,定时打印日志 接到个需求,通过log4j定时打印日志,需求描述如下:需要能够定时打印日志,时间间隔可配.说到定时,首先想到了DailyRollingFileAppender类,各种定时,根据datePattern,这个可以参考类SimpleDateFormat类,常见的一些定时设置如下: '.'yyyy-MM: 每月  '.'yyyy-ww: 每周   '.'yyyy-MM-dd: 每天  '.'yyyy-MM-dd-a: 每天两次  '.'yyyy-MM-dd-HH: 每小时 

Java NIO原理图文分析及代码实现_java

前言: 最近在分析hadoop的RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.可以参考:http://baike.baidu.com/view/32726.htm )机制时,发现hadoop的RPC机制的实现主要用到了两个技术:动态代理(动态代理可以参考博客:http://weixiaolu.iteye.com/blog/1477774 )和java NIO.为了能够正确地分析

编译原理scanner的java代码

问题描述 编译原理scanner的java代码 package lexer; public class Token { public final int tag;public Token(int t) { tag = t;}public String toString() { return """" + (char) tag;} } package lexer; public class Tag { public final static int AND = 256