用 Java 实现一个快速排序算法
快速排序是排序算法中效率最高的一种,它是利用递归的原理,把数组无限制的分成两个部分,直到所有数据都排好序为止。
快速排序是对冒泡排序的一种改进。它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
如果要排序的数组是 A[1]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为中间数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一趟快速排序的算法如下所示:
(1)设置两个变量 i、 j,排序开始的时候:i = 1,j = N–1。
(2)以第一个数组元素作为中间数据,赋值给 privot,即 pivot = A[0]。
(3)从 j 开始向前搜索,即由后开始向前搜索(j--),找到第一个小于 X 的值。
(4)从 i 开始向后搜索,即由前开始向后搜索(i++),找到第一个大于 X 的值,并与上一步找到的数字交换。
(5)重复第3、4步,直到 i >= j。
(6)然后把 j 所在的数字与 pivot 交换。
(7)最后把 j 以前的数组和 j 到最后的数组,再进行递归的快速排序。
以下是该题目的代码实现:
package com.fhcq.quicksort;
public class QuickSort {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[] { 5, 9, 8, 4, 7, 3, 6, 2 }; //定义数组
print(a); //打印之前的顺序
sort(a, 0, a.length-1); //排序
print(a); //打印排序后的结果
}
//打印方法
private static void print(int[] before) {
// TODO Auto-generated method stub
for (int i = 0; i < before.length; i++) { //遍历
System.out.print(before[i] + ""); //打印,以空格隔开
}
System.out.println(); //换行
}
//排序方法
static void sort(int[] a, int low, int high) {
// TODO Auto-generated method stub
if(low >= high){ //low小于或等于high,则直接返回
return;
}
if((high - low) == 1){ //如果只有两个数字,则直接比较
if(a[0] > a[1]){
swap(a, 0, 1);
return;
}
}
int pivot = a[low]; //取第一个数作为中间数
//左滑块当前的下标数,从第2个数字开始,从最后一个开始
int left = low + 1;
int right = high; //右滑块当前的下标数
while(left < right){ //左右循环
//从左边开始找
while(left < right && left <= high){ //如果左小于右则一直循环
if(a[left] > pivot){ //找到一个大的数字
break;
}
left++; //左下标往右边走一点
}
//从右边开始找
while(left <= right && right > low){ //如果左大于右则一直循环
if(a[right] <= pivot){ //找到一个小的数字
break;
}
right--; //右下标往左走一点
}
if(left < right){ //如果还没找完,则交换数字
swap(a,right,left);
}
swap(a,low,right); //交换中间数字
sort(a,low,right); //排序前面的数组
sort(a,right+1,high); //排序后边数组
}
}
//掉位方法
private static void swap(int[] array, int i, int j) {
// TODO Auto-generated method stub
int temp;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
用 Java 实现一个快速排序算法的更多相关文章
- java实现的快速排序算法
快速排序的原理:选择一个关键值作为基准值.比基准值小的都在左边序列(一般是无序的),比基准值大的都在右边(一般是无序的).一般选择序列的第一个元素. 一次循环:从后往前比较,用基准值和最后一个值比较, ...
- 用 Java 实现一个插入排序算法
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法:插入排序法.插入排序的基本操作就是将一个数据插入到已经排好序的有序 ...
- 用 Java 实现一个冒泡排序算法
冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面.即首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如 ...
- java算法面试题:排序都有哪几种方法?请列举。用JAVA实现一个快速排序。选择冒泡快速集合至少4种方法排序
package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util.Compar ...
- 算法-java代码实现快速排序
快速排序 对于一个int数组,请编写一个快速排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] ...
- 快速排序算法 java 实现
快速排序算法 java 实现 快速排序算法Java实现 白话经典算法系列之六 快速排序 快速搞定 各种排序算法的分析及java实现 算法概念 快速排序是C.R.A.Hoare于1962年提出的一种划分 ...
- 排序系列 之 快速排序算法 —— Java实现
基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变 ...
- 排序算法系列:快速排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https: ...
- Java中的经典算法之快速排序(Quick Sort)
Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...
随机推荐
- python---重点(设计模式)
前戏:设计模式简介 设计模式是面向对象设计的解决方案,是复用性程序设计的经验总结.(与语言无关,任何语言都可以实现设计模式) 设计模式根据使用目的的不同而分为创建型模式(Creational Patt ...
- NYOJ 数独 DFS
数独 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 数独是一种运用纸.笔进行演算的逻辑游戏.玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一 ...
- PyQt4 里的表格部件的使用方法: QTableWidget
PyQt4 里的表格部件的使用方法: QTableWidget QT下QTableWidget使用方法小结 - - 博客频道 - CSDN.NET http://blog.csdn.net/jingz ...
- Ubuntu 15.04 双击运行 *.sh、*.py文件
源 起 之前一直在Windows下用AndoridStudio,今天试了一下在Linux系统Ubuntu 15.04中配置Android Studio: 过程和Windws下差不多,但是最后没有生成桌 ...
- UNIX环境高级编程 第8章 进程控制
本章是UNIX系统中进程控制原语,包括进程创建.执行新程序.进程终止,另外还会对进程的属性加以说明,包括进程ID.实际/有效用户ID. 进程标识 每个进程某一时刻在系统中都是独一无二的,它们之间是用一 ...
- oracle 创建表空间 、用户 、赋权、建表
一.创建表空间 1.创建临时表空间 create temporary tablespace TS_TEM_TAB_SPACE tempfile 'D:\oracle\TS_TEM_TAB_SPACE. ...
- connect系统调用
/* * Attempt to connect to a socket with the server address. The address * is in user space so we ve ...
- 【转】WCF光芒下的Web Service
WCF光芒下的Web Service 学习.NET的开发人员,在WCF的光芒照耀下,Web Service 似乎快要被人遗忘了.因为身边做技术的人一开口就是WCF多么的牛逼!废话不多,本人很久不写博客 ...
- 基于vue配置axios
转载地址:https://juejin.im/post/5a02a898f265da43052e0c85 1.背景 在项目开发中ajax请求是必不可缺少 一部分ajax请求不需要loading或则请求 ...
- AdvStringGrid 固定行、列