选择排序
将要排序的对象分作两部份,一个是已排序的,一个是未排序的,从后端未排序部份选择一个最小值,并放入前端已排序部份的最后一个,例如:
排序前:70 80 31 37 10 1 48 60 33 80
[1] 80 31 37 10 70 48 60 33 80 选出最小值1
[1 10] 31 37 80 70 48 60 33 80 选出最小值10
[1 10 31] 37 80 70 48 60 33 80 选出最小值31
[1 10 31 33] 80 70 48 60 37 80 ......
[1 10 31 33 37] 70 48 60 80 80 ......
[1 10 31 33 37 48] 70 60 80 80 ......
[1 10 31 33 37 48 60] 70 80 80 ......
[1 10 31 33 37 48 60 70] 80 80 ......
[1 10 31 33 37 48 60 70 80] 80 ......
插入排序
像是玩朴克一样,我们将牌分作两堆,每次从后面一堆的牌抽出最前端的牌,然后插入前面一堆牌的适当位置,例如:
排序前:92 77 67 8 6 84 55 85 43 67
[77 92] 67 8 6 84 55 85 43 67 将77插入92前
[67 77 92] 8 6 84 55 85 43 67 将67插入77前
[8 67 77 92] 6 84 55 85 43 67 将8插入67前
[6 8 67 77 92] 84 55 85 43 67 将6插入8前
[6 8 67 77 84 92] 55 85 43 67 将84插入92前
[6 8 55 67 77 84 92] 85 43 67 将55插入67前
[6 8 55 67 77 84 85 92] 43 67 ......
[6 8 43 55 67 77 84 85 92] 67 ......
[6 8 43 55 67 67 77 84 85 92] ......
气泡排序法
顾名思义,就是排序时,最大的元素会如同气泡一样移至右端,其利用比较相邻元素的方法,将大的元素交换至右端,所以大的元素会不断的往右移动,直到适当的位置为止。
基本的气泡排序法可以利用旗标的方式稍微减少一些比较的时间,当寻访完阵列后都没有发生任何的交换动作,表示排序已经完成,而无需再进行之后的回圈比较与交换动作,例如:
排序前:95 27 90 49 80 58 6 9 18 50
27 90 49 80 58 6 9 18 50 [95] 95浮出
27 49 80 58 6 9 18 50 [90 95] 90浮出
27 49 58 6 9 18 50 [80 90 95] 80浮出
27 49 6 9 18 50 [58 80 90 95] ......
27 6 9 18 49 [50 58 80 90 95] ......
6 9 18 27 [49 50 58 80 90 95] ......
6 9 18 [27 49 50 58 80 90 95] 由于接下来不会再发生交换动作,排序提早结束
在上面的例子当中,还加入了一个观念,就是当进行至i与i+1时没有交换的动作,表示接下来的i+2至n已经排序完毕,这也增进了气泡排序的效率。
public class BasicSort {
public static void selectionSort(int[] number) {
for(int i = 0; i < number.length - 1; i++) {
int m = i;
for(int j = i + 1; j < number.length; j++)
if(number[j] < number[m])
m = j;
if(i != m)
swap(number, i, m);
}
}
public static void injectionSort(int[] number) {
for(int j = 1; j < number.length; j++) {
int tmp = number[j];
int i = j - 1;
while(tmp < number[i]) {
number[i+1] = number[i];
i--;
if(i == -1)
break;
}
number[i+1] = tmp;
}
}
public static void bubbleSort(int[] number) {
boolean flag = true;
for(int i = 0; i < number.length-1 && flag; i++) {
flag = false;
for(int j = 0; j < number.length-i-1; j++) {
if(number[j+1] < number[j]) {
swap(number, j+1, j);
flag = true;
}
}
}
}
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格式的电子书,方便...
### 常见程式演算整理 #### 一、老掉牙问题 ##### 1. 河内之塔 **说明** 河内之塔(Towers of Hanoi),这是一个经典的递归问题,源自于1883年法国数学家埃德加·卢卡斯(Édouard Lucas)提出的一个传说故事。...
"经典算法(常见程式演算)"这个主题涵盖了从基础到高级的各种算法,旨在帮助开发者深入理解数据结构与算法,提高编程能力。C++和Java是两种广泛使用的编程语言,它们在实现算法时具有不同的优势,C++以其高效和低...
本资源"java常见程式演算"专注于Java语言中的经典算法,同时也包含了一些C++的实现,这对于想要深入理解算法并对比不同语言实现的人来说极具价值。 Java中的算法通常涉及到以下几个核心领域: 1. 排序算法:包括...
"常見程式演算"是程序员提升技能的重要领域,它包括了各种经典的算法和逻辑思维挑战。这个压缩包文件的标题和描述暗示了其内容可能包含了丰富的程序设计练习题目,旨在帮助学习者提升对算法的理解和应用能力。 首先...
本资源"常見程式演算的经典算法"集合了一系列常见的编程练习题目,旨在帮助学习者通过解决这些问题提升自己的编程技能。其中涵盖了C语言和Java两种编程语言的实现。 1. **排序算法**:包括冒泡排序、插入排序、选择...
**常見程式演算**,这个主题涵盖了编程领域中一系列重要的算法和问题解决技巧,旨在提升程序员的逻辑思维和编程能力。在这个集合中,我们可能会遇到各种各样的经典算法题目,这些题目通常被用于面试、竞赛编程或者...
调洪演算软件是一款专为水利工程师和科研人员设计的专业工具,用于模拟洪水过程和评估洪水控制措施的效果。它在毕业设计、项目规划以及洪水风险分析中扮演着关键角色。这款软件结合了复杂的数学模型和直观的用户界面...
常見程式演算」主要收集一些常見的程式練習題目,您可以藉這些題目培養一些程式設計邏輯的感覺,對題目的分類只是個大概,方便索引而已,實作的部份是使用 C 及 Java。
“常见程式演算”主要收集一些常见的程式练习题目,您可以藉这些题目培养一些程式设计逻辑的感觉,对题目的分类只是个大概,方便索引而已,实作的部份是使用 C 及 Java。
在实际应用中,SQL是最常见且广泛使用的数据库查询语言,它结合了关系代数和关系演算的特点,提供了简洁且强大的查询能力。理解关系代数和关系演算是学习SQL查询的基础,有助于深入理解数据库的查询机制和优化策略。...
本教程通过一个登录系统的例子来深入探讨Static变量的应用。 首先,登录系统是常见的软件功能之一,通常涉及用户输入用户名和密码进行身份验证。在这个特定的例子中,我们关注的是错误处理机制——如果用户连续三次...
2. Scheduling(排程法):决定并建立计算机作业之处理顺序之一种方法。 3. Screening Routers(用一组授权规则):允许或不允许流量通过的一种路由器。 4. SDLC(System Development Life Cycle):系统发展生命...
**C语言常见的演算法笔记** 本笔记主要涵盖了在C语言编程中经常遇到的算法问题,旨在帮助学习者提升编程逻辑思维..."常見程式演算筆記.CHM"这个文件包含了这些算法的详细讲解和实例,是学习C语言演算法的重要资源。
"常见程式演算"这个主题涵盖了多种经典算法,如排序算法(冒泡排序、快速排序、归并排序、堆排序)、搜索算法(二分查找、深度优先搜索、广度优先搜索)、图论算法(Dijkstra最短路径算法、Floyd-Warshall全距离算法...
基因演算法(Genetic Algorithms, GA),又称遗传算法或基因遗传算法,是一种启发式搜索算法,它模拟了生物进化过程中的自然选择和遗传机制。这种算法可以追溯到20世纪50年代,当时生物学家和计算机科学家开始尝试在...
### 关于Lambda演算的教程介绍 #### 一、引言与定义 Lambda演算(λ-calculus)是由美国逻辑学家阿隆佐·邱奇在20世纪30年代提出的一种形式系统,它最初被设计为研究有效可计算函数数学特性的工具。经过几十年的...
谓词逻辑法采用谓词合式公式和一阶谓词演算把要解决的问题变为一个有待证明的问题,然后采用消解定理和消解反演来证明一个新语句是从已知的正确语句导出的。语义网络是知识的一种图解表示,使用节点和弧线或链线组成...