快速排序法(quick sort)是目前所公认最快的排序方法之一(视解题的对象而定),虽然快速排序法在最差状况下可以达O(n2),但是在多数的情况下,快速排序法的效率表现是相当不错的。
快速排序法的基本精神是在数列中找出适当的轴心,然后将数列一分为二,分别对左边与右边数列进行排序,而影响快速排序法效率的正是轴心的选择。
这边所介绍的第一个快速排序法版本,是在多数的教科书上所提及的版本,因为它最容易理解,也最符合轴心分割与左右进行排序的概念,适合对初学者进行讲解。
解法
这边所介绍的快速演算如下:
将最左边的数设定为轴,并记录其值为 s
回圈处理:
令索引 i 从数列左方往右方找,直到找到大于 s 的数
令索引 j 从数列右方往左方找,直到找到小于 s 的数
如果 i >= j,则离开回圈
如果 i < j,则交换索引i与j两处的值
将左侧的轴与 j 进行交换
对轴左边进行递回
对轴右边进行递回
透过以下演算法,则轴左边的值都会小于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 QuickSort {
public static void sort(int[] number) {
sort(number, 0, number.length-1);
}
private static void sort(int[] number,
int left, int right) {
if(left < right) {
int s = number[left];
int i = left;
int j = right + 1;
while(true) {
// 向右找
while(i + 1 < number.length && number[++i] < s) ;
// 向左找
while(j -1 > -1 && number[--j] > s) ;
if(i >= j)
break;
swap(number, i, j);
}
number[left] = number[j];
number[j] = s;
sort(number, left, j-1); // 对左边进行递回
sort(number, j+1, right); // 对右边进行递回
}
}
private static void swap(int[] number, int i, int j) {
int t;
t = number[i];
number[i] = number[j];
number[j] = t;
}
}
分享到:
相关推荐
"常见程式演算笔记.rar" 是一个压缩包文件,它包含了一系列关于程式设计的练习题目,旨在帮助学习者提升程式设计逻辑思维。这些题目涵盖了多种常见的程式演算问题,通过解决这些问题,你可以深入理解程式设计的基本...
“常见程式演算”主要收集一些常见的程式练习题目,您可以藉这些题目培养一些程式设计逻辑的感觉,对题目的分类只是个大概,方便索引而已,实作的部份是使用 C 及 Java。 本人已亲手制作成CHM格式的电子书,方便...
"经典算法(常见程式演算)"这个主题涵盖了从基础到高级的各种算法,旨在帮助开发者深入理解数据结构与算法,提高编程能力。C++和Java是两种广泛使用的编程语言,它们在实现算法时具有不同的优势,C++以其高效和低...
### 常见程式演算整理 #### 一、老掉牙问题 ##### 1. 河内之塔 **说明** 河内之塔(Towers of Hanoi),这是一个经典的递归问题,源自于1883年法国数学家埃德加·卢卡斯(Édouard Lucas)提出的一个传说故事。...
本资源"java常见程式演算"专注于Java语言中的经典算法,同时也包含了一些C++的实现,这对于想要深入理解算法并对比不同语言实现的人来说极具价值。 Java中的算法通常涉及到以下几个核心领域: 1. 排序算法:包括...
"常見程式演算"是程序员提升技能的重要领域,它包括了各种经典的算法和逻辑思维挑战。这个压缩包文件的标题和描述暗示了其内容可能包含了丰富的程序设计练习题目,旨在帮助学习者提升对算法的理解和应用能力。 首先...
**常見程式演算**,这个主题涵盖了编程领域中一系列重要的算法和问题解决技巧,旨在提升程序员的逻辑思维和编程能力。在这个集合中,我们可能会遇到各种各样的经典算法题目,这些题目通常被用于面试、竞赛编程或者...
本资源"常見程式演算的经典算法"集合了一系列常见的编程练习题目,旨在帮助学习者通过解决这些问题提升自己的编程技能。其中涵盖了C语言和Java两种编程语言的实现。 1. **排序算法**:包括冒泡排序、插入排序、选择...
常見程式演算」主要收集一些常見的程式練習題目,您可以藉這些題目培養一些程式設計邏輯的感覺,對題目的分類只是個大概,方便索引而已,實作的部份是使用 C 及 Java。
“常见程式演算”主要收集一些常见的程式练习题目,您可以藉这些题目培养一些程式设计逻辑的感觉,对题目的分类只是个大概,方便索引而已,实作的部份是使用 C 及 Java。
**C语言常见的演算法笔记** 本笔记主要涵盖了在C语言编程中经常遇到的算法问题,旨在帮助学习者提升编程逻辑思维..."常見程式演算筆記.CHM"这个文件包含了这些算法的详细讲解和实例,是学习C语言演算法的重要资源。
"常见程式演算"这个主题涵盖了多种经典算法,如排序算法(冒泡排序、快速排序、归并排序、堆排序)、搜索算法(二分查找、深度优先搜索、广度优先搜索)、图论算法(Dijkstra最短路径算法、Floyd-Warshall全距离算法...
2. Scheduling(排程法):决定并建立计算机作业之处理顺序之一种方法。 3. Screening Routers(用一组授权规则):允许或不允许流量通过的一种路由器。 4. SDLC(System Development Life Cycle):系统发展生命...
- **基因编码(Gene Encoding)**: 染色体的表示形式,常见的编码方式包括二进制编码、整数编码、实数编码等。 - **适应度函数(Fitness Function)**: 用于评估染色体好坏的标准。 - **选择(Selection)**: 确定...
规范化是确保数据库合理性和减少冗余的关键步骤,常见的规范化理论有第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和BCNF(博科斯范式)。 5. 数据库完整性:完整性规则确保数据库中的数据准确无误。实体完整...
过程式编程是一种常见的编程范式,它强调通过一系列的步骤(过程)来处理数据。过程式编程并不是一种落后的编程模式,而是有其独特的应用场景。 示例代码: ```javascript var data1, data2, data3; function ...
Haskell是一种纯函数式编程语言,它以数学中λ演算为基础,具有强大的抽象能力以及对并发编程的良好支持。 函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免改变状态和可变数据。在函数式编程中,...