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经典算法之快速排序法(三) 在探讨快速排序法的过程中,我们已经了解到轴的选择对于算法效率至关重要。本文将介绍一种高效的轴选择方法,该方法来源于著名的算法书籍《Introduction to Algorithms》。通过...
### C经典算法之快速排序法(二) #### 知识点概述 本篇文章将深入探讨快速排序算法的一个改进版本,并通过具体的代码实现来展现这一优化思路。在快速排序法(一)的基础上,本文重点关注轴的选择对算法性能的影响...
快速排序是一种高效的排序算法,由C.R.A.Hoare在1962年提出。它基于分治策略,但其完整流程可以更准确地描述为“挖坑填数+分治法”。快速排序的核心思想是通过选取一个基准数,将数组分为两部分:一部分的所有元素都...
### C经典算法之快速排序法(一) #### 快速排序法概述 快速排序法(Quick Sort)是一种高效的排序算法,被广泛认为是目前最快的排序方法之一,尤其是在处理大规模数据时,其平均时间复杂度为O(nlogn),在实际应用...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。...总的来说,快速排序是计算机科学中重要的排序算法之一,理解并掌握其原理和实现对于编程学习和实际应用都有很大帮助。
本篇文章将详细讲解四种经典的排序算法:快速排序、冒泡排序、选择排序和堆排序。 **快速排序**,由C.A.R. Hoare在1960年提出,是一种效率较高的分治算法。它的基本思想是选取一个“基准”元素,通过一趟排序将待...
快速排序、归并排序和堆排序都是经典且高效的排序算法,它们各自具有独特的实现方式和性能特点。这篇文章将详细探讨这三个排序算法,并对比它们的时间复杂度。 首先,我们来看快速排序。快速排序由C.A.R. Hoare在...
选择排序、插入排序和快速排序都是经典的排序算法,各有其特点和适用场景。接下来,我们将详细探讨这三个排序算法。 1. **选择排序(Selection Sort)** 选择排序是一种简单直观的排序算法。它的基本思想是在未...
本文将详细讲解六种经典的排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序以及桶排序,并结合提供的文件名(sort.c、set.c、main.c、set.h、sort.h)推测出每个文件可能包含的代码实现。 1. **合并...
根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...
直接插入排序、冒泡排序、快速排序、直接选择排序、堆排序和二路归并排序是计算机科学中经典的排序算法,它们在数据处理和算法学习中占有重要地位。这些排序算法各有特点,适用场景不同,下面将逐一详细介绍,并结合...
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
严蔚敏版的《数据结构》是一本经典的数据结构教材,书中详细介绍了各种数据结构及其操作,包括快速排序在内的各种排序算法。第八章可能涵盖了快速排序的基本概念、算法实现、时间复杂度分析以及优化策略等内容。 ...
这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...
本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...
本资源提供了七大经典排序算法的实现程序,包括快速排序、冒泡排序、选择排序、归并排序、插入排序、希尔排序和堆排序。下面将逐一详细介绍这些排序算法及其原理。 1. 快速排序:由C.A.R. Hoare提出,是一种采用...
根据给定的信息,本文将详细介绍五种经典的排序算法在 C# 中的应用,包括选择排序、冒泡排序、快速排序、插入排序以及希尔排序。 ### 一、选择排序 选择排序是一种简单直观的比较排序算法。它的工作原理是通过从未...
本项目涵盖了五种经典的排序算法:快速排序、堆排序、归并排序、插入排序和选择排序。接下来,我们将深入探讨这些算法的原理、实现及性能特点。 1. **快速排序**: 快速排序由C.A.R. Hoare在1960年提出,是一种采用...
根据给定的文件信息,我们将深入探讨快速排序算法的...总之,快速排序作为一种经典的排序算法,其高效的性能使其成为解决大规模数据排序问题的理想选择。掌握快速排序的原理和实现对于IT行业的从业者来说是非常重要的。
这里我们主要探讨两种经典的排序算法:快速排序和合并排序。 快速排序是一种分治算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是选取一个基准元素,将数组分为两部分,一部分的所有元素都小于或...