說明
快速排序法(quick sort)是目前所公認最快的排序方法之一(視解題的對象而定),雖然快速排序法在最差狀況下可以達O(n2),但是在多數的情況下,快速排序法的效率表現是相當不錯的。
快速排序法的基本精神是在數列中找出適當的軸心,然後將數列一分為二,分別對左邊與右邊數列進行排序,而影響快速排序法效率的正是軸心的選擇。
這邊所介紹的第一個快速排序法版本,是在多數的教科書上所提及的版本,因為它最容易理解,也最符合軸心分割與左右進行排序的概念,適合對初學者進行講解。
解法
這邊所介紹的快速演算如下:
1. 將最左邊的數設定為軸,並記錄其值為 s
廻圈處理:
1. 令索引 i 從數列左方往右方找,直到找到大於 s 的數
2. 令索引 j 從數列右方往左方找,直到找到小於 s 的數
3. 如果 i >= j,則離開迴圈
4. 如果 i < j,則交換索引i與j兩處的值
5. 將左側的軸與 j 進行交換
6. 對軸左邊進行遞迴
7. 對軸右邊進行遞迴
透過以下演算法,則軸左邊的值都會小於s,軸右邊的值都會大於s,如此再對軸左右兩邊進行遞迴,就可以對完成排序的目的,例如下面的實例,*表示要交換的數,[]表示軸:
* [41] 24 76* 11 45 64 21 69 19 36*
* [41] 24 36 11 45* 64 21 69 19* 76
* [41] 24 36 11 19 64* 21* 69 45 76
* [41] 24 36 11 19 21 64 69 45 76
* 21 24 36 11 19 [41] 64 69 45 76
在上面的例子中,41左邊的值都比它小,而右邊的值都比它大,如此左右再進行遞迴至排序完成。
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 i = left;
int j = right + 1;
while(true) {
// 向右找
while(i + 1 < number.length && number[++i] < number[left]) ;
// 向左找
while(j -1 > -1 && number[--j] > number[left]) ;
if(i >= j)
break;
swap(number, i, j);
}
swap(number, left, j);
sort(number, left, j-1); // 對左邊進行遞迴
sort(number, j+1, right); // 對右邊進行遞迴
}
}
private static void swap(int[] number, int i, int j) {
int t = number[i];
number[i] = number[j];
number[j] = t;
}
}
分享到:
相关推荐
描述中的程序实现了快速排序法,可能是用一种编程语言如C++、Java或Python编写的,用于对一维数组进行排序。这种程序的实现一般包括上述的三个主要步骤,并可能包含优化措施,例如处理小数组时改用插入排序,或者...
快速排序是一种高效的排序算法,它使用分治策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。在C语言中实现快速排序,通常涉及到以下几个关键知识点: 1. 递归函数:快速排序的核心是递归...
在描述中提到的“一个快速排序法的例子”是一个具体的应用场景,即生成1亿个随机数并使用快速排序算法对其进行排序,整个过程大约耗时26秒。这个时间可能因硬件性能、数据分布均匀性以及实现细节等因素而有所不同。...
### C经典算法之快速排序法(三) 在探讨快速排序法的过程中,我们已经了解到轴的选择对于算法效率至关重要。本文将介绍一种高效的轴选择方法,该方法来源于著名的算法书籍《Introduction to Algorithms》。通过...
这是一个用Java语言实现的快速排序算法,快速排序算法是根据分冶思想去实现的。
直接排序法、折半插入法、希尔排序法和快速排序法是计算机科学中常见的排序算法,它们在数据处理和算法理解上都具有重要的地位。这些排序算法的C语言实现为初学者提供了很好的学习材料,特别是在VC++6.0环境下进行...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...
### 快速排序法的C++实现 #### 算法概述 快速排序是一种非常高效的排序算法,由英国计算机科学家托尼·霍尔于1960年提出。它的基本思想是采用分治策略来把一个序列分为较小的两部分,然后递归地对这两部分进行排序...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治法(Divide and Conquer)。在这个算法中,我们选择一个元素作为“基准”(pivot),然后将数组分为两部分:一部分...
然而,标题中的"java Document 快速排序法"可能指的是在一个包含文档数据的结构(如数组)中实现快速排序,而不是直接在Document对象上操作。由于Document主要处理文本数据,我们通常不会直接在Document上进行数值...
### C经典算法之快速排序法(一) #### 快速排序法概述 快速排序法(Quick Sort)是一种高效的排序算法,被广泛认为是目前最快的排序方法之一,尤其是在处理大规模数据时,其平均时间复杂度为O(nlogn),在实际应用...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它基于分治法(Divide and Conquer)的思想,是计算机科学中最为广泛使用的排序算法之一。分治法的基本策略是将一个复杂的问题分解成两...
在快速排序中,我们选择一个基准值(pivot),然后将数组分为两部分:一部分包含所有小于基准的元素,另一部分包含所有大于或等于基准的元素。这个过程通过递归地对这两部分进行快速排序来完成,直到子数组的大小...
JAVA快速排序法是一种高效的排序算法,属于选择排序的一种。它的主要思想是通过选择一个基准元素,将数组分成两个部分:一部分比基准元素小,一部分比基准元素大,然后递归地对这两个部分进行排序。 在 JAVA 中,...
快速排序是一种高效的排序算法,采用分治法策略来把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。快速排序在平均情况下的时间复杂度为O(n log n),最坏情况下的时间复杂度为O(n^2)。其主要优点是...
快速排序是一种高效的排序算法,由英国计算机科学家C.A.R. Hoare在1960年提出。它的基本思想是分治策略,通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再...
根据给定文件中的标题、描述、标签以及部分内容,可以总结并提炼出以下关于“使用JAVA语言实现的对数据的快速排序法”的相关知识点: ### 一、知识点概述 #### 标题:用JAVA语言实现的对数据的快速排序法 - **主要...
基本思想是选取一个基准元素,通过一趟排序将待排序序列分为两部分,一部分的所有元素都比另一部分的所有元素小,然后再对这两部分分别进行快速排序,整个排序过程可以递归进行,以此达到整个序列有序。 2. **归并...
快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。 步骤为: 从数列中挑出一个元素,称为“基准”(pivot), 重新排序数列,所有比基准值小的元素摆放在基准前面...
快速排序的核心在于选择一个基准值,并根据这个基准值将待排序的数据分为两部分:一部分的所有数据都比另一部分的小(或大),然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到...