`
ansjsun
  • 浏览: 203046 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法实现系列第三章.快速排序

 
阅读更多

先剽窃jdk的...

package algorithm;

import java.util.Arrays;

/**
 * 快速排序,哦也
 * 
 * @author ansj
 * 
 */
public class QuickSort {
	public static void main(String[] args) {
		long[] ints = { 123, 1234, 324, 2, 1, 12, 31, 4, 3, 3, 466, 7, 87, 87, 56, 456, 5 };
		sort(ints, 0, ints.length);
		for (int i = 0; i < ints.length; i++) {
			System.out.println(ints[i]);
		}
	}

	private static void sort(long x[], int off, int len) {
		// Insertion sort on smallest arrays
		if (len < 7) {
			for (int i = off; i < len + off; i++)
				for (int j = i; j > off && x[j - 1] > x[j]; j--)
					swap(x, j, j - 1);
			return;
		}

		// Choose a partition element, v
		int m = off + (len >> 1); // Small arrays, middle element
		if (len > 7) {
			int l = off;
			int n = off + len - 1;
			if (len > 40) { // Big arrays, pseudomedian of 9
				int s = len / 8;
				l = med3(x, l, l + s, l + 2 * s);
				m = med3(x, m - s, m, m + s);
				n = med3(x, n - 2 * s, n - s, n);
			}
			m = med3(x, l, m, n); // Mid-size, med of 3
		}
		long v = x[m];

		// Establish Invariant: v* (<v)* (>v)* v*
		int a = off, b = a, c = off + len - 1, d = c;
		while (true) {
			while (b <= c && x[b] <= v) {
				if (x[b] == v)
					swap(x, a++, b);
				b++;
			}
			while (c >= b && x[c] >= v) {
				if (x[c] == v)
					swap(x, c, d--);
				c--;
			}
			if (b > c)
				break;
			swap(x, b++, c--);
		}

		// Swap partition elements back to middle
		int s, n = off + len;
		s = Math.min(a - off, b - a);
		vecswap(x, off, b - s, s);
		s = Math.min(d - c, n - d - 1);
		vecswap(x, b, n - s, s);

		// Recursively sort non-partition-elements
		if ((s = b - a) > 1)
			sort(x, off, s);
		if ((s = d - c) > 1)
			sort(x, n - s, s);
	}

	private static int med3(long x[], int a, int b, int c) {
		return (x[a] < x[b] ? (x[b] < x[c] ? b : x[a] < x[c] ? c : a) : (x[b] > x[c] ? b : x[a] > x[c] ? c : a));
	}

	/**
	 * Swaps x[a .. (a+n-1)] with x[b .. (b+n-1)].
	 */
	private static void vecswap(long x[], int a, int b, int n) {
		for (int i = 0; i < n; i++, a++, b++)
			swap(x, a, b);
	}

	/**
	 * Swaps x[a] with x[b].
	 */
	private static void swap(long x[], int a, int b) {
		long t = x[a];
		x[a] = x[b];
		x[b] = t;
	}
}
 
分享到:
评论

相关推荐

    快速排序算法(c#实现)

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    快速排序算法是一种高效的排序算法,它的工作原理是通过选择一个元素作为pivot,然后将数组分为两个部分,以达到排序的目的。快速排序算法的时间复杂度为O(n log n),因此它适合大规模的数据排序。 5.归并排序算法 ...

    数据结构及应用算法教程习题第三章排序.pdf

    数据结构及应用算法教程中的第三章主要探讨了排序这一核心概念。排序是计算机科学中处理数据的基本操作之一,它涉及到将一组数据按照特定的顺序排列。排序算法的效率和稳定性对于程序性能至关重要。 1. 稳定性:在...

    快速排序算法以及归并算法

    根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...

    字符的快速排序算法(12KB)...

    在VB(Visual Basic)编程中,字符的快速排序算法是一种高效的数据组织方法,它通过分治策略实现数组或字符串的排序。快速排序是由C.A.R. Hoare在1960年提出的,由于其平均时间复杂度为O(n log n),在实际应用中表现...

    快速排序算法c++实现

    C++是面向对象的编程语言,它提供了丰富的库支持和高效的语言特性,非常适合实现各种算法,包括快速排序。在C++中实现快速排序,通常需要以下步骤: 1. **选择基准元素**:可以随机选取数组中的一个元素作为基准,...

    快速排序算法的java实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...

    7种常用排序算法实现(C++)(冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序以及快速排序)

    这七种算法分别是:冒泡排序、选择排序、直接插入排序、希尔排序、堆排序、归并排序和快速排序。 1. **冒泡排序**: 冒泡排序是最基础的排序算法之一,通过重复遍历待排序序列,比较相邻元素并交换位置来实现排序...

    算法导论第三版答案.pdf

    常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序等。本资源中,提供了排序算法的解决方案,包括选择排序和归并排序的实现细节。 选择排序(Selection Sort)是一种简单的排序算法,其基本思想...

    北京工业大学 数据结构与算法 (电控学院) 第三章排序实验 快速排序 归并排序 基数排序

    本资源为数据结构与算法第三章(排序)的实验程序代码。包含以下的三个程序:1.快速排序;2.归并排序;3.基数排序。 北工大电控学院《数据结构与算法》课程的其它章节实验及作业程序代码亦已在本站上传,需要的同学...

    归并排序算法实现(排序算法系列1)

    在本系列的第一部分,我们将深入探讨归并排序的基本原理、实现过程以及其在实际应用中的优势。 归并排序的工作原理可以分为三个主要步骤:分割、归并和合并。首先,将待排序的序列分割成两个相等(或近乎相等)的...

    快速排序算法相关分析

    快速排序算法是一种有效的排序算法,虽然算法在最坏的情况下运行时间为 O(n^2),但由于平均运行时间为 O(nlogn),并且在内存使用、程序实现复杂性上表现优秀,尤其是对快速排序算法进行随机化的可能,使得快速排序在...

    快速排序算法C语言实现

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,即将一个大问题分解为小问题来解决。在这个案例中,我们关注的是如何用C语言实现快速排序。 快速排序的步骤...

    快速排序算法实现 c#代码

    3. **快速排序函数(QuickSort)**:此函数实现了快速排序算法的核心逻辑,它递归地对数组的不同部分进行排序。 - 参数: - `arr`:要排序的数组。 - `low`:当前排序区间的低端索引。 - `high`:当前排序区间的...

    C语言快速排序算法实现

    标题:C语言快速排序算法实现 描述:本文将深入探讨如何使用C语言实现快速排序算法,这是一种高效的排序方法,广泛应用于各种数据结构处理场景。快速排序的基本思想是通过一趟排序将待排记录分隔成独立的两部分,...

    算法设计与分析(python)第六章.zip

    压缩包中的“第六章”很可能包含了以上提到的算法在Python中的实现代码,如分治法的快速排序、动态规划的斐波那契数列、贪心算法的活动选择问题等。通过阅读和理解这些代码,可以加深对算法的理解,提升编程能力。 ...

    快速排序算法实现 基于VC6.0

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer),通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的...

    labuladong的算法小抄 GitHub 68.8k star的硬核算法教程 算法小抄_第五章.pdf

    在算法部分,可能会涉及排序算法(如冒泡排序、快速排序、归并排序)、查找算法(如二分查找、哈希查找)、图论(如最短路径算法Dijkstra、拓扑排序)等。这些算法不仅需要理解其工作原理,还需要掌握如何在实际问题...

    7. 快速排序里的学问:枢纽元选择与算法效率1

    选择第一个元素作为枢纽元的实现可以在前一篇专题《快速排序的学问:霍尔快排的实现》中找到,而选择最后一个元素作为枢纽元的例子可以在《快速排序的过程》中看到。当输入数据随机时,这种策略是可行的,但在预排序...

    快速排序算法实现.txt

    根据提供的文件信息,我们可以深入探讨快速排序算法的原理与实现。 ### 快速排序算法概述 快速排序是一种高效的排序算法,由英国计算机科学家托尼·霍尔(Tony Hoare)在1960年提出。它采用分治策略来把一个序列...

Global site tag (gtag.js) - Google Analytics