`

Java快速排序算法整理(二)

阅读更多
package boke.sort;

/**
 * 快速排序
 * 
 * @since jdk1.5及其以上
 * @author 毛正吉
 * @version 1.0
 * @date 2010.05.24
 * 
 */
public class QuickSort2 {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int maxSize = 10000;
		QuickSort2 bs = new QuickSort2(maxSize);

		for (int i = 1; i <= 100; i++) {
			int v = (int) (Math.random() * 101);
			bs.insert(v);
		}
		bs.output(); // 原始输出
		bs.quickSort(); // 排序
		bs.output(); // 排序输出

	}

	private long[] a; // 整型数据容器
	private int nElems; // 元素个数

	/**
	 * 构造方法
	 * 
	 * @param maxSize
	 */
	public QuickSort2(int maxSize) {
		a = new long[maxSize];
		nElems = 0;
	}

	/**
	 * 容器放入数据
	 * 
	 * @param value
	 */
	public void insert(long value) {
		a[nElems++] = value;
	}

	/**
	 * 输出容器数据
	 */
	public void output() {
		for (int j = 0; j < nElems; j++) {
			System.out.print(a[j] + " ");
		}
		System.out.println("");
	}

	/**
	 * 快速排序
	 */
	public void quickSort() {
		recQuickSort(0, nElems - 1);
	}

	/**
	 * 快速排序
	 * 
	 * @param left
	 * @param right
	 */
	private void recQuickSort(int left, int right) {
		int size = right - left + 1;

		if (size <= 3) {
			manualSort(left, right);
		} else {
			long median = manualOf3(left, right);
			int partition = partitionIt(left, right, median);
			recQuickSort(left, partition - 1); // 左段排序
			recQuickSort(partition + 1, right); // 右段排序
		}
	}

	/**
	 * 
	 * @param left
	 * @param right
	 * @return
	 */
	private long manualOf3(int left, int right) {
		int center = (left + right) / 2;

		if (a[left] > a[center]) { // 排序: left & center
			swap(left, center);
		}
		if (a[left] > a[right]) { // 排序: left & right
			swap(left, right);
		}
		if (a[center] > a[right]) { // 排序: center & right
			swap(center, right);
		}
		swap(center, right - 1);
		return a[right - 1];
	}

	/**
	 * 
	 * @param left
	 * @param right
	 */
	private void manualSort(int left, int right) {
		int size = right - left + 1;

		if (size <= 1) {
			return;
		}

		if (size == 2) {
			if (a[left] > a[right]) {
				swap(left, right);
			}
			return;
		} else {
			if (a[left] > a[right - 1]) {
				swap(left, right - 1); // left,center
			}
			if (a[left] > a[right]) {
				swap(left, right); // left, right
			}
			if (a[right - 1] > a[right]) {
				swap(right - 1, right); // center, right
			}
		}

	}

	/**
	 * 快速排序
	 * 
	 * @param left
	 * @param right
	 * @param pivot
	 * @return
	 */
	private int partitionIt(int left, int right, long pivot) {
		int leftPtr = left;
		int rightPtr = right - 1;

		while (true) {
			while (a[++leftPtr] < pivot) {
				;
			}

			while (a[--rightPtr] > pivot) {
				;
			}

			if (leftPtr >= rightPtr) {
				break;
			} else {
				swap(leftPtr, rightPtr);
			}
		}
		swap(leftPtr, right - 1);
		return leftPtr;
	}

	/**
	 * 交换
	 * 
	 * @param leftPtr
	 * @param rightPtr
	 */
	private void swap(int leftPtr, int rightPtr) {
		long temp = a[leftPtr];
		a[leftPtr] = a[rightPtr];
		a[rightPtr] = temp;

	}
}
分享到:
评论

相关推荐

    Java选择排序算法源码

    在编程领域,排序算法是计算机科学中的基础概念,它们用于整理数据序列,使其按照特定顺序排列。本主题将深入探讨Java实现的选择排序算法,这是一种简单直观的排序算法,适合新手学习。 选择排序(Selection Sort)...

    Java排序算法详细整理

    【Java排序算法详细整理】 在计算机科学中,排序算法是用于对一组数据进行排列的算法。在Java中,实现各种排序算法有助于理解数据结构和算法的原理,同时也能提高编程能力。以下是对Java中常见的几种排序算法的详细...

    基于Java按位拆分快速排序算法的数值仿真.pdf

    基于Java按位拆分快速排序算法的基本思想是:首先根据数据中的比特对数据进行划分整理,将待排序列的每个数拆分成(≥2)个k位;然后按照数据由高到低每次截取k位的顺序,将待排序列分成个子序列,高k位相同的数据安排...

    java实现常见排序算法

    插入排序是一种简单直观的排序算法,它的工作原理类似于我们日常生活中整理扑克牌的过程。Java中常见的插入排序实现有三种:直接插入排序、折半插入排序和希尔排序。 1. **直接插入排序**: 直接插入排序的基本...

    JAVA经典算法收集整理

    在实际应用中,根据数据规模和特定场景,可能需要选择更适合的排序算法,例如快速排序、归并排序或者堆排序等,这些高级排序算法在处理大数据集时往往能提供更好的性能。了解和掌握这些算法,有助于提升JAVA程序员的...

    Java实现排序算法

    在编程领域,排序算法是计算机科学中的基础但至关重要的部分,尤其在Java这样的高级编程语言中。这些算法用于整理一组数据,使其按照特定顺序排列,如升序或降序。以下将详细介绍Java中几种常见的排序算法: 1. ...

    java 排序算法 选择排序,插入排序,自顶向上合并排序,合并排序,快速排序

    在编程领域,排序算法是数据结构与算法学习中的重要组成部分,尤其在Java中,掌握各种排序算法对于优化程序性能至关重要。以下将详细讲解标题和描述中提到的五种排序算法:选择排序、插入排序、自顶向上合并排序、...

    Java直接插入排序算法源码

    直接插入排序是一种基础且简单的排序算法,它的工作原理类似于我们日常生活中的整理扑克牌。在Java中实现这个算法,我们可以从以下几个关键知识点入手: 1. **基本思想**:直接插入排序是通过构建有序序列,对于未...

    Java常用排序算法

    插入排序是一种简单直观的排序算法,它的工作原理类似于我们日常生活中整理扑克牌的过程。算法分为两个阶段:遍历待排序的数组,将每个元素插入到已排序部分的正确位置。在Java中,可以使用两层循环实现插入排序,...

    java-排序算法总结

    在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,它可以帮助我们快速查找、分析和处理大量数据。本篇将深入探讨Java中实现的几种...

    3种排序算法(快速、二路归并、插入)java

    这里我们讨论的是三种经典的排序算法:快速排序、二路归并排序和插入排序,它们都是用Java语言实现的。以下是对这三种排序算法的详细介绍: 1. **插入排序(Insertion Sort)**: 插入排序是一种简单直观的排序...

    Java实现常用排序算法

    本文将深入探讨Java中实现的四种基本排序算法:插入排序、交换排序(包括快速排序和冒泡排序)、选择排序以及归并排序。虽然树形选择排序和堆排序在这次实现中未涵盖,但理解这四种排序算法的基本原理和Java实现方式...

    Java各种排序算法代码

    在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,使得数据按照特定顺序排列。本资源包含了一系列的Java实现的排序算法,旨在帮助...

    几个JAVA的排序算法

    Java作为一种广泛使用的编程语言,提供了丰富的内置排序方法,如Arrays类中的sort()方法,但了解并实现基本的排序算法有助于理解其工作原理,提高编程能力。以下是标题和描述中提到的一些Java排序算法的详细解释: ...

    Java 七种排序算法实现

    在编程领域,排序算法是数据结构与算法学习中的基础部分,尤其在Java中,掌握不同的排序算法对于优化程序性能至关重要。本资源包含了七种经典的排序算法实现,它们分别是冒泡排序、插入排序、递归排序(这里可能是指...

    排序算法 Java经典算法

    在编程领域,排序算法是计算机科学中的核心概念,特别是在Java这样的高级编程语言中。排序算法是用来组织和优化数据结构的关键工具,它使得数据按照特定顺序排列,如升序或降序。本篇将深入探讨Java中的一些经典排序...

    Java排序算法!经典算法

    在Java编程语言中,排序算法是数据结构与算法领域中的重要组成部分。它们用于对一组数据进行整理,使得数据按照特定顺序排列。在这个示例中,我们看到了三种经典的排序算法:选择排序(Selection Sort),冒泡排序...

    java实现的4种排序算法(冒泡、快速、插入、选择)

    插入排序是一种简单直观的排序算法,它的工作原理类似于我们手动整理扑克牌。在已排序的部分中找到新元素的正确位置,并将其插入。DirectInsertSort.java文件包含了此算法的实现。对于小规模数据或部分有序的数据,...

Global site tag (gtag.js) - Google Analytics