数据结构---快速排序   java

快速排序(Quicksort)是对冒泡排序的一种改进。

快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。

32

32

12 3 45 15 25 20 24
24
24 12 3
24 12 3 45
24 12 3 20 45
24 12 3 20 15 25 45
24 12 3 20 15 25 32 45

第一次,拿第一个数32,

从右向左比,直到找到比32小的数, 拿第一个数32与最后一个数24比,比32小,把24放到第一个位置,

然后从左向右比,直到找到比32大的数,

拿第二个数12与32比,比32小,继续拿第三个数3与32比,比32小,继续拿第四个数45与32比,比32大,将45放到最后一个位置,

第二次,继续按此方法,从两边往中间找,直到找到左边碰到右边,中间没有数了,将32放入该位置,

这时,32左边得数全是比他小的,右边的数全是比他大的,

然后用此方法,将32左边全部数的,拿第一个24,12当作第一个数,最后一个数25当作最后一个数,继续比,直到找完,

代码:
package com.wangyq.Test;
//快速排序
public class Quick {
	public int[] quick(int[] array,int left, int right){
		int i = left;
		int j = right;
		if(left <right){
			int tmp = array[i];
			do{
				while(array[j] > tmp && i < j){
					j--;
				}
				if(i < j){
					array[i] = array[j];
					i++;
				}
				while(array[i] < tmp && i < j){
					i++;
				}
				if(i < j){
					array[j] = array[i];
					j--;
				}
			}while(i != j);
			array[i] = tmp;
			quick(array, left, i-1);
			quick(array, i+1, right);
		}

		return array;
	}

	public static void main(String[] args) {
		int[] array = { 32, 12, 3, 45, 15, 25, 20, 24 };
		array = new Quick().quick(array,0,array.length-1);

		for (int i = 0; i < array.length; i++)
			System.out.print(array[i] + "  ");
	}
}
时间: 2024-10-25 21:42:37

数据结构---快速排序   java的相关文章

插入排序,希尔排序,堆排序,归并排序,快速排序Java实现

参看:数据结构与算法分析-c语言描述 public class Main { public static void main(String[] args) { String[] a = { "a", "d", "e", "f", "m" }; String[] b = { "a", "h", "g", "l", "z&

排序算法----快速排序java

快速排序是对冒泡排序的一种改进,平均时间复杂度是O(nlogn) import java.util.Arrays; import java.util.Scanner; public class test02{ public static void main(String[] args) { int n = 1; while (n != 0){ Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); int s[] = ne

数据结构(JAVA版本)练习之集合 简易图书管理系统

数据结构实用教程(JAVA版) 看完第一章  集合   结合书中代码 稍微修改做个小练习: 课程表类: package com.chujianyun.com; public class Table { private String key; private String rest; public Table() { } public Table(String key, String rest) { super(); this.key = key; this.rest = rest; } publ

数据结构在Java中的用法(持续更新...)

今天做了Medallia公司的Java面试题,发现用惯了C/C++之后对Java感到异常地不适应,特别是对数据结构在Java中如何使用感到十分头疼,于是开始整理并练习Java API里头关于数据结构的使用方法.甲骨文的Java API对每一种数据结构只提供解释但没有提供相关的例子,很不方便,因为大多数时候我们都是通过读例子来学习用法,这也是我学C++觉得最有用的方法. Vector 甲骨文API:"The Vector class implements a growable array of o

手写快速排序(java实现)

手写快速排序(java实现) 时间复杂度: O(nlogn) 快速排序原理: 定义一个基准元素base(我这里定义的是最左面的元素定位基准元素) 定义两个变量i和j j先从右向左遍历,找到第一个比base小的数就停止 i再从左向右便利找到第一个比base大的数停止 交换i和j指向的元素 直到i和j指向同一个元素,将这个元素与基准元素交换 递归求解即可 图解:(排序过程) 注意: 上图为第一次快速排序的过程,递归过程和上图一致(没有给出) 每一次的排序结果: 现在在火车上没有给出具体每次排序结果,

java - 数据结构 - 快速排序

- -网上找结果很多都是无法排序有重复数据的,因此查了查资料写个改良版 百度百科: 快速排序算法通过多次比较和交换来实现排序,其排序流程如下: (1)首先设定一个分界值,通过该分界值将数组分成左右两部分. (2)将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边.此时,左边部分中各元素都小于或等于分界值,而右边部分中各元素都大于或等于分界值. (3)然后,左边和右边的数据可以独立排序.对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,

[数据结构] 快速排序

基本思想 快速排序(Quicksort)是对冒泡排序的一种改进,又称划分交换排序(partition-exchange sort. 快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists). 步骤为: ①.从数列中挑出一个元素,称为"基准"(pivot) ②.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边).在这个分区结束之后,该基准就处于数列的中间位置.这个称

数据结构(Java语言)——HashTable(开放定址法)简单实现

分离链接散列算法的缺点是使用一些链表.由于给新单元分配地址需要时间,因此这就导致算法的速度有些减慢,同时算法实际上还要求对第二种数据结构的实现.另有一种不用链表解决冲突的方法是尝试另外一些单元,直到找出空的单元为止.更常见的是,单元h0(x),h1(x),h2(x),...相继被试选,其中hi(x)=(hash(x)+f(i)) mod TableSize,且f(0)=0.函数f是冲突解决方法,因为所有的数据都要置于表内,所以这种解决方案所需要的表要比分离链接散列的表大.一般来说,对于不使用分离

随机化快速排序(Java实现)

Randomized quicksort(随机化快速排序) running time is independent of input ordering. no assumption about the input distribution.(无需对输入序列分布做任何假设) no specific input elicit the worst-case behavior.(没有特定输入引起最差的运行效率) worst-case determined only by a random -number