`

高级排序之快速排序

 
阅读更多

这一个算是一个比较完善的快速排序了吧,就是代码多了点,没办法,要想性能好,考虑的东西就得多点。

package sort;

public class QuickSort {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 10000000;
		int[] arr = new int[n];
		for (int i = n; i > 0; i--) {
			arr[i - 1] = i;
		}
		QuickSort q = new QuickSort(arr);
		long now = System.currentTimeMillis();
		q.sort();
		System.out.println("time="+(System.currentTimeMillis() - now));
		//q.display();
	}

	private int[] arr;
	
	public QuickSort(int[] arr){
		this.arr = arr;
	}
	
	public void display(){
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
		}
	}
	
	public void sort(){
		recQuickSort(0,arr.length - 1);
	}
	private void recQuickSort(int left,int right){
		int size = right - left + 1;
		if(size < 10){
			//小于10的小数组可以用插入排序,比较省事
			insertSort(left,right);
		}else{
			int maddie = getMiddleValue(left,right);
			//获取最平均的枢纽值
			int partition = partitionIt(left,right,maddie);
			recQuickSort(left,partition - 1);
			recQuickSort(partition + 1,right);
		}
	}
	
	
	/**将指定范围内的数据用枢纽值切割成两个部分,
	 * 枢纽值做为分界,在枢纽值左边的全部小于它,右边全部大于它
	 * @param left 左边索引
	 * @param right 右边索引
	 * @param privot 枢纽值
	 * @return
	 */
	private int partitionIt( int left, int right, int privot) {
		int leftPtr = left;
		int rightPtr = right - 1;
		while(true){
			//左边第二个数据(第一个数据已经在getMiddleValue方法里排好序,肯定比枢纽值小)和枢纽值比较,碰到小于枢纽值的数据停止比较
			while(arr[++leftPtr] < privot);
			//右边第三个数据和枢纽值比较(右边第一个在getMiddleValue方法里排序肯定比枢纽值大,第二个是枢纽值本身,都不用比较)
			while(arr[--rightPtr] > privot);
			//指针交叉停止比较
			if(leftPtr >= rightPtr){
				break;
			}else{
				//将左边小于枢纽值的数据和右边大于枢纽值的数据交换
				swap(leftPtr,rightPtr);
			}
		}
		//将枢纽值放到边界处(此时该枢纽值已经处于最终排序的位置,也就是说它不需要再移动了)
		swap(leftPtr,right - 1);
		return leftPtr;
	}

	/**获取比较平均的枢纽值(这在逆序的情况下很有用)
	 * 分别取最左,中间,最右三个值,取当中的中间值作为枢纽值,并对它们排序
	 * @param left
	 * @param right
	 * @return
	 */
	private int getMiddleValue( int left, int right) {
		int middle = (left + right)/2;
		if(arr[left] > arr[middle])
			swap(left,middle);
		if(arr[left] > arr[right])
			swap(left,right);
		if(arr[middle] > arr[right])
			swap(middle,right);
		//中间值和最右边倒数第二个值交换,这样的话最右边和其左边第一个都不用参加和枢纽值的比较,因为他们是大于等于的。
		swap(middle,right - 1);
		return arr[right - 1];
	}

	/**交换元素
	 * @param a
	 * @param b
	 */
	private void swap(int a,int b){
		int temp = arr[a];
		arr[a] = arr[b];
		arr[b] = temp;
	}
	
	/**插入排序
	 * @param left
	 * @param right
	 */
	private void insertSort(int left,int right){
		int out,inner,temp;
		for (out = left + 1 ; out < right; out++) {
			 temp = arr[out];
			 inner = out;
			 while(inner > left && arr[inner - 1] >= temp){
				 arr[inner] = arr[inner - 1];
				 inner--;
			 }
			 arr[inner] = temp;
		}
	}
}
 100w逆序排序耗时28毫秒。比希尔快一点哦。付出的是复杂的算法和大量的代码。看如何取舍咯。
分享到:
评论

相关推荐

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    快速排序是C++中最常用的排序算法之一,由英国计算机科学家C.A.R. Hoare提出。它使用分治策略,选择一个基准元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分的元素都大于基准,然后递归地对这两部分...

    快速排序算法和冒泡排序效率对比

    相比之下,快速排序由C.A.R. Hoare在1960年提出,是一种分治策略的体现。快速排序的基本思想是选取一个基准值,将数组分为两部分:一部分的元素都小于基准,另一部分的元素都大于或等于基准。然后对这两部分分别进行...

    高级排序算法C++源码

    在IT领域,排序算法是计算机...通过阅读和理解`高级排序.cpp`文件,你可以了解到如何在C++中实现这些高级排序算法,并从中学习如何优化和比较排序算法的性能。这将对提升你的编程技能和理解复杂数据处理有极大的帮助。

    Jquery表格排序插件,支持快速排序

    - `method`:排序算法的选择,可选`'simply'`(简单排序)或`'advance'`(高级排序,默认为快速排序)。 - `type`:数据类型,用于确定排序规则,可选`'number'`(数字排序)或`'string'`(字符串排序)。 - `attr`...

    C#中 8种初级+高级排序方法

    这里我们将探讨8种在C#中实现的初级和高级排序方法,这些方法在数据结构和算法的学习中至关重要。以下是每种排序方法的详细介绍: 1. **冒泡排序 (Bubble Sort)** 冒泡排序是最简单的排序算法之一,它通过重复遍历...

    高级算法设计实验4:快速排序

    2、熟练使用高级编程语言实现不同的快速排序算法。 3、利用实验测试给出不同快速排序算法的性能以理解其优缺点。 快速排序是算法导论中的经典算法。在本实验中,给定一个长为 n 的整数数 组,要求将数组升序排序。

    普林斯顿快速排序PPT

    ### 普林斯顿快速排序PPT核心知识点解析 #### 快速排序算法详解 ...通过以上介绍,我们不仅了解了快速排序的基本流程,还掌握了其实现方法及应用场景,这对于进一步学习其他高级排序算法也有很好的铺垫作用。

    winform 快速排序算法源码

    快速排序是一种高效的排序算法...由于快速排序的原地排序特性(不需要额外的存储空间),它在空间效率上优于许多其他高级排序算法。在WinForm应用中,快速排序可以有效地处理大量数据的排序需求,提供良好的用户体验。

    TIA博途中通过SCL语言实现快速排序的具体方法示例.docx

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。...尽管如此,由于其优秀的平均性能,快速排序仍然被广泛使用,并被认为是在相同数量级排序算法中平均性能最佳的选择之一。

    快速排序 希尔排序 插入排序 折半排序算法

    - 由于其简单性,插入排序常用于其他高级排序算法的基础。 4. **折半排序(Binary Insertion Sort)**: - 折半插入排序是插入排序的一个变体,它在插入元素时使用二分查找来确定插入位置,从而减少比较次数。 -...

    多线程实现冒泡排序和快速排序

    本文将深入探讨如何使用多线程来实现冒泡排序和快速排序这两种经典的排序算法,这对于初学者来说是一次很好的学习机会。 首先,让我们理解冒泡排序。冒泡排序是一种简单直观的排序算法,它的基本思想是通过重复遍历...

    java实现的shell排序快速排序归并排序堆排序

    本篇将详细介绍标题所提及的四种排序算法:Shell排序、快速排序、归并排序以及堆排序。 1. **Shell排序**: Shell排序是一种改进的插入排序,由Donald Shell于1959年提出。它通过设置一个间隔序列,使得数组中的...

    高级排序 数据结构

    在高级排序中,归并排序、堆排序、希尔排序和快速排序是四种非常重要的算法,它们各自有着独特的原理和应用。下面将详细阐述这四种排序算法。 1. **归并排序(Merge Sort)**: 归并排序是一种分治策略的典型应用。...

    选择排序、冒泡排序、快速排序、折半查找

    虽然冒泡排序简单易懂,但它的效率较低,尤其对于大规模数据,性能不如其他高级排序算法。 快速排序是一种高效的排序算法,由C.A.R. Hoare在1960年提出。它的基本思想是采用分治法,选取一个基准元素,将数组分为两...

    易语言高级表格各列同步排序

    虽然易语言的高级表格控件可能会提供内置的排序功能,但为了实现高效排序,开发者可能需要了解和实现如快速排序、归并排序等高效的排序算法。这些算法能在大数据量时显著提高性能。 在提供的压缩包文件中,"易语言...

    六种基本排序算法,堆,归并,希尔,快速排序等

    在计算机科学中,排序算法是数据处理的重要组成部分,它们用于将一组无序的数据按照特定顺序进行排列。...了解这些基础排序算法有助于我们理解更高级的排序算法,如快速排序、归并排序的变体以及各种优化技术。

    利用汇编语言实现快速排序,汇编语言排序算法

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法,通过选取一个“基准”元素,将数组分为两个子数组,使得一个子数组的所有元素都小于基准,另一个子数组的所有...

    Java 快速排序

    总的来说,快速排序是一种非常重要的排序算法,对于理解分治法和递归有着重要的意义,也是很多其他高级算法的基础。在Java编程中,熟练掌握快速排序能够帮助开发者编写出更高效、更稳定的代码。

    易语言实现高级表格根据某列文本、数值排序

    排序功能是高级表格的核心特性之一,它允许用户按照指定列的数据进行升序或降序排列。实现这一功能通常有两种主要方法:冒泡排序和二分查找。在易语言中,我们通常会选择性能更高的二分查找算法,因为它在处理大量...

    冒泡排序、选择排序、插入排序

    总的来说,这些排序算法的实现有助于理解排序的基本原理,为学习更高级的排序算法,如快速排序、归并排序和堆排序等打下基础。在实际应用中,我们会根据数据规模、数据特性以及性能需求选择合适的排序算法。

Global site tag (gtag.js) - Google Analytics