說明
之前說過軸的選擇是快速排序法的效率關鍵之一,在這邊的快速排序法的軸選擇方式更加快了快速排序法的效率,它是來自演算法名書 Introduction to Algorithms 之中。
解法
先說明這個快速排序法的概念,它以最右邊(或最左邊)的值s作比較的標準,將整個數列分為三個部份,一個是小於s的部份,一個是大於s的部份,一個是未處理的部份,如下所示 :
在排序的過程中,i 與 j 都會不斷的往右進行比較與交換,最後數列會變為以下的狀態:
然後將s的值置於中間,接下來就以相同的步驟會左右兩邊的數列進行排序的動作,如下所示:
整個演算的過程,直接摘錄書中的虛擬碼來作說明:
QUICKSORT(A, p, r)
if p < r
then q <- PARTITION(A, p, r)
QUICKSORT(A, p, q-1)
QUICKSORT(A, q+1, r)
end QUICKSORT
PARTITION(A, p, r)
x <- A[r]
i <- p-1
for j <- p to r-1
do if A[j] <= x
then i <- i+1
exchange A[i]<->A[j]
exchange A[i+1]<->A[r]
return i+1
end PARTITION
一個實際例子的演算如下所示:
public class Sort {
public static void quick(int[] number) {
sort(number, 0, number.length-1);
}
private static void sort(int[] number, int left, int right) {
if(left < right) {
int q = partition(number, left, right);
sort(number, left, q-1);
sort(number, q+1, right);
}
}
private static int partition(int number[], int left, int right) {
int i = left - 1;
for(int j = left; j < right; j++) {
if(number[j] <= number[right]) {
i++;
swap(number, i, j);
}
}
swap(number, i+1, right);
return i+1;
}
private static void swap(int[] number, int i, int j) {
int t = number[i];
number[i] = number[j];
number[j] = t;
}
}
分享到:
相关推荐
### C经典算法之快速排序法(三) 在探讨快速排序法的过程中,我们已经了解到轴的选择对于算法效率至关重要。本文将介绍一种高效的轴选择方法,该方法来源于著名的算法书籍《Introduction to Algorithms》。通过...
快速排序是一种高效的排序算法,它使用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。在C语言中实现快速排序,通常涉及到以下几个关键知识点: 1. 递归函数:快速排序的核心是递归...
描述中的程序实现了快速排序法,可能是用一种编程语言如C++、Java或Python编写的,用于对一维数组进行排序。这种程序的实现一般包括上述的三个主要步骤,并可能包含优化措施,例如处理小数组时改用插入排序,或者...
文件名列表中的"快速排序1.txt"至"快速排序3.txt"可能包含了这三种快速排序方法的实现代码或详细解释。在学习这些文件时,你可以关注如何选择主元、如何进行分区操作以及如何进行递归调用等关键步骤。通过理解和实践...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...
然而,标题中的"java Document 快速排序法"可能指的是在一个包含文档数据的结构(如数组)中实现快速排序,而不是直接在Document对象上操作。由于Document主要处理文本数据,我们通常不会直接在Document上进行数值...
在描述中提到的“一个快速排序法的例子”是一个具体的应用场景,即生成1亿个随机数并使用快速排序算法对其进行排序,整个过程大约耗时26秒。这个时间可能因硬件性能、数据分布均匀性以及实现细节等因素而有所不同。...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治法(Divide and Conquer)的思想,是计算机科学中最为广泛使用的排序算法之一。分治法的基本策略是将一个复杂的问题分解成两...
因此,在实际编程中,往往会在快速排序的基础上加入一些优化策略,如随机化选择枢轴、三数取中等,以提高算法的稳定性和适应性。 总的来说,快速排序是计算机科学中不可或缺的排序算法之一,它的理解和实现是每个...
根据给定文件中的标题、描述、标签以及部分内容,可以总结并提炼出以下关于“使用JAVA语言实现的对数据的快速排序法”的相关知识点: ### 一、知识点概述 #### 标题:用JAVA语言实现的对数据的快速排序法 - **主要...
#### 三、快速排序算法的实现步骤 1. **选择基准**:从序列中挑选一个元素作为基准。 2. **分区操作**:重新排列数组,所有比基准小的元素放到基准前面,所有比基准大的元素放到基准后面(相同的数可以放到任一边)...
快速排序的时间复杂度可以分为三种情况:最坏时间复杂度、最好时间复杂度和平均时间复杂度。 * 最坏时间复杂度:最坏情况是指每次区间划分的结果都是基准关键字的左边(或右边)序列为空,而另一边区间中的记录仅比...
快速排序法是计算机科学中一种高效的排序算法,其时间复杂度在平均情况下为O(nlogn),这使得它成为处理大规模数据集时的首选排序算法之一。快速排序法由英国计算机科学家托尼·霍尔(Tony Hoare)于1960年提出,基于...
归并排序也是基于分治法的排序算法,但与快速排序不同的是,它不是通过交换元素来实现排序,而是通过合并已排序的子数组来达到目的。归并排序的过程如下: 1. **分割**:将原始数组分为两个或更多个子数组,每个子...
本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer)...另外,对于具有大量重复元素的数组,可以使用三向切分的快速排序版本,以进一步优化性能。
### C经典算法之快速排序法(一) #### 快速排序法概述 快速排序法(Quick Sort)是一种高效的排序算法,被广泛认为是目前最快的排序方法之一,尤其是在处理大规模数据时,其平均时间复杂度为O(nlogn),在实际应用...
快速排序法是一种高效的排序算法,广泛应用于计算机科学领域。它是由英国计算机科学家托尼·霍尔在1960年提出的。快速排序的基本思想是通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一...
- **三向切分**:对于有大量重复元素的数组,可以采用三向切分快速排序,将数组分为小于、等于和大于基准的三部分,减少比较和交换的次数。 - **随机化**:随机选择基准值可以避免最坏情况的发生,提高平均性能。 ...