断断续续地看了《JAVA数据结构与算法》,一直没有好好整理下,久了就忘记了。这里把排序的笔记记录如下(代码都出自《JAVA数据结构与算法》):
1、 冒泡排序:
(1) 思想:从左边第一个数据项开始,跟其右边的数据项比较,如果左边的数值大于右边的,则进行交换,这样直到最后一个结束,一次循环就把最大的数放在最右边。第二次同样,到右边的倒数第二个结束,以此类推。直到所有的数据项有序。
(2) 代码:
for (int out = eItem - 1; out > 0; out--) {
for (int in = 0; in < out; in++) {
if (a[in] > a[in + 1])
swap(in, in + 1);//根据位置交换数据项
}
}
(3) 复杂度:比较和交换均为O(N2)
2、 选择排序:
(1) 思想:各数据项依次进行比较,找出最小的那个数据项,把它跟左边第一个数据项进行交换。第二次则从第二项开始,找出剩余的最小的数据项跟第二项进行交换。以此类推。
(2) 代码:
for (out = 0; out < eItem - 1; out++) {
min = out;
for (in = out + 1; in < eItem; in++)
if (a[in] < a[min])
min = in; // 取得最小的值
swap(out, min); //
}
(3) 复杂度:交换为O(N),比较仍为O(N2)
3、 插入排序:
(1) 思想:先将左边的两个数据项排好序,然后第三个数据项再跟排好序的数据项比较,插入到正确位置。之后第四个数据项再插入到已经有序的三个数据项里。以此类推。
(2) 代码:
for (out = 1; out < eItem; out++) {
long temp = a[out]; // 将当前标记对象值传给temp
in = out; // 将当前标记值的位置给IN
// 如果前一个数大于后一个数,则将前一个数的值给后一个数,同时插入位置减一
while (in > 0 && a[in - 1] > temp) {
a[in] = a[in - 1];
in--;
}
a[in] = temp;// 找到被标记的对象插入的位置
}
(3) 复杂度: O(N2),数据有序为O(N),逆序则比冒泡排序效率低
4、 希尔排序:
(1) 与插入排序类似,只是加大元素之间的间隔(插入排序为1),并在这些有间隔的元素中进行插入排序,逐步缩小间隔,直到间隔为1。
(2) 代码:
int inner, outer;
long temp;
int h = 1;
while (h <= eItem / 3)
h = h * 3 + 1;
while (h > 0) {
for (outer = h; outer < eItem; outer++) {
inner = outer;
temp = a[outer];
while (inner > h - 1 && a[inner - h] >= temp) {
a[inner] = a[inner - h];
inner -= h;
}
a[inner] = temp;
}
h = (h - 1) / 3;
}
(3) 复杂度: O(N3/2)—O(N7/6)
5、 快速排序:
(1) 取最右边的数据项值为关键字,依据此关键字将数据分为两组,小于关键字的和大于关键字的。这两组又各自进行快速排序,直到全部有序。
(2) 代码:
public void recQuickSort(int left, int right) {
if (left >= right)
return;
else {
long pivot = a[right]; // 取最右边的值为要划分的中间值关键字
int partition = partitionIt(left, right, pivot); // 关键字所在位置
recQuickSort(left, partition - 1);// 对关键字左边进行快速排序
recQuickSort(partition + 1, right);
}
}
public int partitionIt(int left, int right, long pivot) {
int leftPtr = left - 1;
int rightPtr = right;
while (true) {
while (leftPtr < right && a[++leftPtr] < pivot)
; // 找到左边区域小于关键字的位置
while (rightPtr > left && a[--rightPtr] > pivot)
;
if (leftPtr >= rightPtr)
break;
else {
swap(leftPtr, rightPtr);// 将找到的左右关键字交换
}
}
swap(leftPtr, right);
return leftPtr;
}
(3) 复杂度: O(N*logN)
分享到:
相关推荐
总的来说,这三种排序方法都是基于比较的排序算法,它们各有特点。选择排序每次只移动一个元素,但可能需要多次交换;直接插入排序适合小规模或部分有序的数据,而冒泡排序则在某些特定情况下能体现出较好的性能。在...
"各种内部排序方法及其比较实验报告" 内部排序是指在计算机内存中对数据进行排序的方法。内部排序方法有很多,常见的有直接插入排序、折半插入排序、希尔排序、冒泡排序、快速排序、堆排序、归并排序等。 直接插入...
在计算机科学领域,排序是处理数据的一个基本任务,它涉及到将一组元素按照特定的顺序排列。本主题将深入探讨几种常见的排序算法,并通过比较它们...通过实践和比较,我们可以更好地理解和选择适合特定问题的排序方法。
这六种排序算法在C语言中的实现各有特色,理解其原理和实现有助于提升编程能力。在实际应用中,需要根据数据规模、数据特性及性能要求来选择合适的排序算法。对于初学者,这些源代码提供了很好的学习资源,通过阅读...
### 字符串排序方法 在JavaScript以及其他的编程语言中,字符串排序是一个常见的需求。无论是对字符串数组进行排序还是对特定的字符串内部字符进行排序,掌握正确的排序方法对于开发者来说至关重要。 #### 标题:...
随即生成一组数据 可以实现三种排序方法的速度比较
本篇文章将综合比较几种常见的排序方法,包括希尔排序和快速排序,这些方法在C语言中实现。首先,我们来看一下这两种排序算法的基本概念和实现细节。 希尔排序,又称为希尔增量排序,是由Donald Shell于1959年提出...
本文将深入探讨内部排序方法,包括归并排序和快速排序的不同实现,以及C++中常见排序方法的实现和比较。同时,我们将讨论各种排序算法在不同场景下的适用性,并提供参考源代码供学习者实践和理解。 首先,归并排序...
交换排序 选择排序 冒泡排序 插入排序
通过MFC界面显示这些排序过程,开发者和学习者能够直观地理解每种排序方法的工作原理,同时通过计时功能比较它们的性能。这不仅有助于理论学习,也对实际编程工作中的算法选择提供了实践参考。在实际应用中,根据...
本项目名为"各种排序方法演示",显然旨在通过Java语言展示多种不同的排序算法。以下是这些排序算法的详细介绍: 1. **Bubble Sort(冒泡排序)** - `BubbleSortAlgorithm.java` 文件中实现的冒泡排序是一种简单的...
Java排序方法是编程中不可或...这些排序方法各有优缺点,选择哪种取决于具体的应用场景,如数据规模、数据分布、稳定性需求以及时间复杂度要求等。理解并熟练掌握这些排序算法对于提升编程技能和解决实际问题至关重要。
1. 掌握各种排序的基本思想。 2. 掌握各种排序方法的算法实现。 3. 掌握各种排序方法的优劣分析及花费的...根据排序函数中的核心语句,计算出每种排序方法的时间复杂度级=及空间复杂度,分析几种排序方法的优劣。
* 通用排序方法 * @param arr 需要排序的数组 * @param field 排序字段 值类型传null 单字段传string 多字段传数组[["field1", SortType], ["field2", SortType]] 可传属性名 方法名 * @param sortType 排序类型...
本资源包“各种排序方法汇总(含有源程序)”提供了多种经典的排序算法的源代码实现,包括堆排序、基数排序、快速排序、直接插入排序和直接选择排序。这些排序算法各有特点,适用于不同的场景,理解它们的原理和实现...
这三种排序方法属于非比较型排序,它们不依赖元素之间的比较,而是通过统计或分配元素到特定的桶中来排序。这些方法通常在特定条件下(如元素范围有限且均匀分布)表现出极高的效率。 对于这些排序算法,我们可以...
数组排序是常见的数据处理任务,本篇文章将对在STM8S003上实现的10种排序方法进行分析和比较。 1. 冒泡排序(Bubble Sort) 冒泡排序是最基础的排序算法,通过不断交换相邻的不正确顺序元素来达到排序目的。它的...
根据给定文件的信息,我们可以提炼出以下几个核心...综上所述,通过对不同排序算法的实现和比较,我们可以深入了解各种排序方法的特点及其适用场景。同时,通过实际编程实现这些算法,还可以提高解决实际问题的能力。
程序的模块化设计包括主程序模块和可排序表单元模块,前者负责接收和处理命令,后者实现了抽象数据类型`OrderableList`,包含了各种排序方法以及输入输出操作。 通过这样的课程设计,学生可以深入理解各种排序算法...
为了优化和比较不同排序算法的效率,程序可能还包含了性能分析功能,如计时器来测量每种排序方法所需的时间,或者使用特定的性能指标如比较次数和交换次数。 总结来说,这个项目旨在培养编程者对基本数据结构、文件...