`

经典之快速排序

 
阅读更多
1. 分区(partition)

快速排序是一种利用分区的思想来实现的一个不错的排序算法, 在弄懂快排之前,还得先弄清楚分区(partition)是怎么弄的。

对于给定的数组a,我们从中选择一个值作为中心点(pivot);
定义两个索引变量分别leftScan,rightScan分别指向数组a的第一个元素和最后一个元素;
定义一个while循环
leftScan从左向右扫描直到a[leftScan]>pivot;
rightScan从右向左扫描直到a[rightScan]<pivot;
如果leftScan>=rightScan,break退出循环
否则,交换a[leftScan]和a[rightScan],然后继续循环;
最后会返回leftScan最为pivot的索引。

这样一趟下来 , 就把给定的数组分成以pivot为中心的两个区,pivot左边的是小于pivot的,pivot右边的是大于pivot的。
public class ArrayParti {
	private long[] a;
	private int nElement;
	public ArrayParti(int max) {
		a = new  long[max];
		nElement = 0;
	}
	
	public int partition(int left,int right,long pivot){
		int leftParti = left-1;
		int rightParti = right+1;
		while(true){
			while(leftParti<right && a[++leftParti]<pivot);
			while(rightParti>left && a[--rightParti]>pivot);
			if(leftParti>=rightParti)break;
			else
				swap(leftParti,rightParti);
		}
		System.out.println("pivot index is:"+leftParti);
		return leftParti;
	}
	private void swap(int one, int two) {
		long temp;
		temp = a[one];
		a[one]=a[two];
		a[two]=temp;
		
	}
	
	public void insert(long v){
		a[nElement]=v;
		nElement++;
	}
	public void display(){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+"\t");
		}
		System.out.print("\n");
	}
}


2.递归实现快速排序
1)数组a中选一个element作为pivot
2)根据选定的pivot给数组分区,左边的都比pivot小,右边的都比pivot大
3)对pivot左边的数据和pivot右边的数据分别递归实现上面的步骤。

public class ArrayQuick1 {
	private long[] a;
	private int nElement;
	public ArrayQuick1(int max) {
		a = new long[max];
		nElement = 0;
	}
	
	public void sort(){
		quickSort(0,nElement-1);
	}
	private void quickSort(int left, int right) {
		if(left-right>=0){
			return;
		}else{
			long pivot = a[right];
			int partition = partition(left,right,pivot);
			quickSort(left,partition-1);
			quickSort(partition+1,right);
		}
	}
	private int partition(int left, int right, long pivot) {
		int leftParti = left-1;
		int rightParti = right;
		while(true){
			while(a[++leftParti]<pivot);
			while(rightParti>0 && a[--rightParti]>pivot);
			if(leftParti>=rightParti)break;
			else
				swap(leftParti,rightParti);
		}
		swap(leftParti,right);
		return leftParti;
	}
	private void swap(int one, int two) {
		long temp;
		temp = a[one];
		a[one]=a[two];
		a[two]=temp;
	}
	
	public void insert(long v){
		a[nElement]=v;
		nElement++;
	}
	public void display(){
		for(int i=0;i<a.length;i++){
			System.out.print(a[i]+"\t");
		}
		System.out.print("\n");
	}
	
	
}
分享到:
评论

相关推荐

    C经典算法之快速排序法(三)

    ### C经典算法之快速排序法(三) 在探讨快速排序法的过程中,我们已经了解到轴的选择对于算法效率至关重要。本文将介绍一种高效的轴选择方法,该方法来源于著名的算法书籍《Introduction to Algorithms》。通过...

    C经典算法之快速排序法(二)

    ### C经典算法之快速排序法(二) #### 知识点概述 本篇文章将深入探讨快速排序算法的一个改进版本,并通过具体的代码实现来展现这一优化思路。在快速排序法(一)的基础上,本文重点关注轴的选择对算法性能的影响...

    白话经典算法系列之六 快速排序 快速搞定 - MoreWindows - 博客园1

    快速排序是一种高效的排序算法,由C.R.A.Hoare在1962年提出。它基于分治策略,但其完整流程可以更准确地描述为“挖坑填数+分治法”。快速排序的核心思想是通过选取一个基准数,将数组分为两部分:一部分的所有元素都...

    C经典算法之快速排序法(一)

    ### C经典算法之快速排序法(一) #### 快速排序法概述 快速排序法(Quick Sort)是一种高效的排序算法,被广泛认为是目前最快的排序方法之一,尤其是在处理大规模数据时,其平均时间复杂度为O(nlogn),在实际应用...

    快速排序算法(C经典实例)

    快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。...总的来说,快速排序是计算机科学中重要的排序算法之一,理解并掌握其原理和实现对于编程学习和实际应用都有很大帮助。

    几种经典排序算法,包括快速排序、冒泡排序、选择排序和堆排序

    本篇文章将详细讲解四种经典的排序算法:快速排序、冒泡排序、选择排序和堆排序。 **快速排序**,由C.A.R. Hoare在1960年提出,是一种效率较高的分治算法。它的基本思想是选取一个“基准”元素,通过一趟排序将待...

    快速排序、归并排序、堆排序 并比较排序时间

    快速排序、归并排序和堆排序都是经典且高效的排序算法,它们各自具有独特的实现方式和性能特点。这篇文章将详细探讨这三个排序算法,并对比它们的时间复杂度。 首先,我们来看快速排序。快速排序由C.A.R. Hoare在...

    c++ 选择排序 插入排序 快速排序

    选择排序、插入排序和快速排序都是经典的排序算法,各有其特点和适用场景。接下来,我们将详细探讨这三个排序算法。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法。它的基本思想是在未...

    合并排序,插入排序,希尔排序,快速排序,冒泡排序,桶排序的C语言实现

    本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...

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

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

    直接插入排序 冒泡排序 快速排序 直接选择排序 堆排序 二路归并排序 C#源代码

    直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...

    算法设计实验报告-快速排序和归并排序

    本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...

    数据结构_快速排序

    严蔚敏版的《数据结构》是一本经典的数据结构教材,书中详细介绍了各种数据结构及其操作,包括快速排序在内的各种排序算法。第八章可能涵盖了快速排序的基本概念、算法实现、时间复杂度分析以及优化策略等内容。 ...

    快速排序与归并排序的算法比较实验报告

    这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...

    数据结构堆排序 快速排序 归并排序

    本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...

    7大排序算法实现程序(快速排序,冒泡排序,选择排序,归并排序,插入排序,希尔排序,堆排序)

    本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...

    C# 常用经典算法,选择排序 冒泡排序 快速排序 插入排序 希尔排序

    根据给定的信息,本文将详细介绍五种经典的排序算法在 C# 中的应用,包括选择排序、冒泡排序、快速排序、插入排序以及希尔排序。 ### 一、选择排序 选择排序是一种简单直观的比较排序算法。它的工作原理是通过从未...

    快速排序,堆排序,归并排序,插入排序,选择排序

    本项目涵盖了五种经典的排序算法:快速排序、堆排序、归并排序、插入排序和选择排序。接下来,我们将深入探讨这些算法的原理、实现及性能特点。 1. **快速排序**: 快速排序由C.A.R. Hoare在1960年提出,是一种采用...

    快速排序快速排序快速排序快速排序快速排序

    根据给定的文件信息,我们将深入探讨快速排序算法的...总之,快速排序作为一种经典的排序算法,其高效的性能使其成为解决大规模数据排序问题的理想选择。掌握快速排序的原理和实现对于IT行业的从业者来说是非常重要的。

    排序算法(合并排序,快速排序)

    这里我们主要探讨两种经典的排序算法:快速排序和合并排序。 快速排序是一种分治算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是选取一个基准元素,将数组分为两部分,一部分的所有元素都小于或...

Global site tag (gtag.js) - Google Analytics