`
ansjsun
  • 浏览: 199625 次
  • 性别: 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;
	}
}
 
分享到:
评论

相关推荐

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

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

    python数据结构与算法,python入门、竞赛必备

    数据结构与算法目录为 数据结构与算法(Python) 1. 引入概念 1.1. 第一次尝试 ...6.4. 快速排序 6.5. 希尔排序 6.6. 归并排序 6.7. 常见排序算法效率比较 6.8. 搜索 7. 树与树算法 7.1. 二叉树 7.2. 二叉树的遍历

    算法分析与设计 课程作业 完整版.docx

    第三章——分治算法 1.归并排序 2.快速排序 3.折半查找 4.选择问题 5.最大子段 第四章——贪心算法 1.背包问题 2.多机调度问题 3.单源最短路径-Dijkstra算法 4.最小代价生成树问题-Prim算法 5.最小代价生成树问题-...

    算法设计与分析 王红梅

    9 .4 实验项目— — —电路布线问题 阅读材料— — —免疫算法 习题 9 第 10 章 概率算法 10 .1 概述 10 .1 .1 概率算法的设计思想 10 .1 .2 随机数发生器 10 .2 舍伍德(Sherwood)型概率算法 10 .2 .1 快速排序 10 ....

    实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip

    直接插入排序(Straight Insertion Sort)是一种简单且古老的排序算法,其基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。12 直接插入排序的算法过程如下: 假设待排序...

    排序算法的图形界面实现

    采用人性化的操作界面,体验算法的深奥与魅力,已经实现的算法包括红黑树,快速排序,堆排序,合并排序,插入排序,提供算法实现源代码,可任意拷贝使用,还会不断增加新的算法实现。 体会实现的算法,只需在右边...

    算法:算法C语言实现 第1-4部分 基础知识、数据结构、排序及搜索

    第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,...

    快速排序实现算法(c)

    此时再执行第三不的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27 38 13 49 76 97 65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。 快速排序就是递归调用此...

    C++大作业4种排序算法演示.docx

    4.快速排序原理:通过一趟排序将要排序的记录分割成独立的两部分,其中一部分的所有记录关键码比另一部分的都小,再按此方法对两部分数据进行递归,实现快速排序。 算法实现:从每趟数据的左边界向右搜索一个比它大...

    第十章 排序作业及答案数据结构

    分别写出希尔排序(d=5)、快速排序、堆排序、归并排序第一趟升序排序后的结果(其中堆排序的第一趟指序列完成初始建堆、将堆顶元素置为最末位置后其余元素调整为堆的结果)(每个3分)。 希尔排序:  快速排序: 堆...

    改进的快速排序算法

    快速排序算法的改进思路 1.选取好的基准,是两边的数据个数尽量的均匀 取数组的第一个,中间,最后一个数据,取三个数中第二大的数作为基准 2. 不递归 3.与插入结合,当段内的数组个数小于等于16的时候,使用...

    数据结构讲义(严蔚敏版)(含算法源码).rar

    第3章 栈和队列 17 一、 基础知识和算法 17 1. 栈 17 2. 链栈 17 3. 顺序栈 18 4. 队列 19 5. 链队列 20 6. 循环队列 20 7. 栈和队列比较 22 8. 简化的栈和队列结构 23 9. 栈和队列的应用 23 二、 习题 24 第4章 串 ...

    合并排序算法,快速排序算法,递归,分治

    实现并验证合并排序算法; Ex2:实现并验证快速排序算法 Ex3:用递归与分治的方法设计并实现寻找第k小元素算法

    C语言实现快速排序算法(含实现步骤)

    快速排序是一种非常高效的排序算法,它的基本原理是采用分治策略。以下是快速排序的原理和实现步骤: 原理: 1、选择一个基准值。 2、通过一趟排序将待排序的序列分割成独立的两部分,其中一部分的所有数据都比另一...

    排序算法.doc

    快速排序 高快省的排序算法 有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列...

    算法导论第三版各种排序算法的c/c++实现

    请参考算法导论第三版英文版Introduction to Algorithms 3rd Edition,本程序为第一章到第八章重要排序等算法的c/c++实现。IDE环境为vc++ 6.0。函数名称与算法导论原文类似。 主要包括: 直接选择排序 归并排序 堆...

    算法导论-第三版(中文).rar

    第七章快速排序(Quicksort) 第八章 线性时间中的排序(Sorting in Linear Time) 第九章 中值与顺序统计(Medians and Order Statistics) 第三部分(Part III) 数据结构(Data Structures) 第十章 基本的...

    算法:C语言实现(第1-4部分) Robert.Sedgewick.part1

    第三部分“排序”(第6~11章)按章节顺序分别讨论基本排序方法(如选择排序、插入排序、冒泡排序、希尔排序等)、快速排序方法、归并和归并排序方法、优先队列与堆排序方法、基数排序方法以及特殊用途的排序方法,并...

    C C++算法实例.c

    快速排序: B.插入排序: C.选择排序: D.冒泡排序 E.堆排序: F. 归并排序 G.基数排序 五、高精度计算 1.高精度加法 2.高精度减法 3.高精度乘以低精度 4.高精度乘以高精度 5.高精度除以低精度 6.高...

Global site tag (gtag.js) - Google Analytics