前沿:
如果您还没有了解基础的冒泡排序,可以点击这里
阅读。
介绍:
在介绍选择排序之前,回顾下冒泡排序。如果有N的数据项,冒泡排序需要比较的次数是N(N-1)/2的次数,而交换的次数也和N的平方成正比。因此大O表示法来表示亦即O(N*N)。选择排序改进了冒泡排序,将不必要的交换次数从O(N*N) 减少到O(N)。不幸的是比较次数依然是O(N*N)。
因此,选择排序相对于冒泡排序其实只是减少了交换的次数。
思路:
为了减少冒泡排序总俩俩比较并交换的缺点,选择排序偏向于较少的交换次数。其做法是:从数组最左端(下标为0位置)开始依次比较,找出数组中最小值并将此数据项记下,然后将找到的最小值与数组最左端(下标为0位置)的数据项进行交换。第一次比较完成之后,得到的结果便是数组中最小的数据项已经被移动到了数组最左端(下标为0)。以此类推,第二次找到数组中第二小的结果并与数组下标为1的位置的数据项进行交换。
核心代码:
public void selectSort() {
int innerLoop, outterLoop, min;
double temp;
for(outterLoop=0;outterLoop<elementCount-1;outterLoop++) {
min = outterLoop;
for(innerLoop=outterLoop+1;innerLoop<elementCount;innerLoop++) {
if(array[innerLoop] < array[min]) {
min = innerLoop;
}//end of if
}//end of for
//swap them
temp = array[min];
array[min] = array[outterLoop];
array[outterLoop] = temp;
}//end of for
}//end of method
核心代码说明:
内层for循环,实际上是找最值的过程。假设数组中下标为0位置的数据项是最小值,从下表为1位置开始于这个最小值相比较,如果找到比min更小的值,就将min更新,下次循环比较的过程将用新的最小值比较。内层for循环比较过之后,数组中最小值已经找到,此时,只需要讲这个找到的最小值与数组下标为0的位置交换即可。
外层for循环,实际控制着等待交换的位置,从0开始直到数组的最后一个位置结束。
完整代码:
package barry.sort.selectsort;
public class SelectSorter {
private double[] array;
private int elementCount;
public SelectSorter(int size) {
array = new double[size];
elementCount = 0;
}//end of constructor
public void insert(double value) {
array[elementCount] = value;
elementCount++;
}//end of method insert()
public void display() {
for(int i=0;i<elementCount;i++) {
System.out.print(array[i]+"\t");
}//end of for
}//end of method display()
public void selectSort() {
int innerLoop, outterLoop, min;
double temp;
for(outterLoop=0;outterLoop<elementCount-1;outterLoop++) {
min = outterLoop;
for(innerLoop=outterLoop+1;innerLoop<elementCount;innerLoop++) {
if(array[innerLoop] < array[min]) {
min = innerLoop;
}//end of if
}//end of for
//swap them
temp = array[min];
array[min] = array[outterLoop];
array[outterLoop] = temp;
}//end of for
}//end of method
}
package barry.sort.selectsort;
public class SelectSorterApp {
public static void main(String[] args) {
SelectSorter sorter = new SelectSorter(91);
sorter.insert(-10); sorter.insert(89);
sorter.insert(-980); sorter.insert(45);
sorter.insert(343); sorter.insert(32);
sorter.insert(5563); sorter.insert(9);
System.out.println("\nBefore Sort:");
sorter.display();
sorter.selectSort();
System.out.println("\nAfter Sort:");
sorter.display();
}
}
运行结果:
Before Sort:
-10.0 89.0 -980.0 45.0 343.0 32.0 5563.0 9.0
After Sort:
-980.0 -10.0 9.0 32.0 45.0 89.0 343.0 5563.0
总结:
不难发现,选择排序和冒泡排序的区别在于:冒泡排序每两个数据项比较之后就有可能需要交换,然而选择排序时从数组中“选出最小值”然后和特性位置的数据项交换。虽然其时间复杂度依旧和冒泡排序一样,但是交换的次数却明显减少。
因此,当交换数据项所需的时间比比较所需的时间大很多时,选择排序时相当快的。
分享到:
相关推荐
数据结构与算法是计算机科学的基础,对于理解和设计高效的软件至关重要。...通过学习,读者应能理解各种数据结构的特点和适用场景,掌握常见算法的实现原理和时间复杂度分析,从而在实际编程中灵活运用,提高代码效率。
数据结构与算法是计算机科学的基础,对于任何编程学习者来说,理解和掌握它们至关重要。这个“数据结构与算法-----PPT版本”很可能包含了徐旭松教授或专家精心制作的一系列教学材料,旨在帮助学习者深入理解这些核心...
- **章节15:何时使用何种数据结构**(第510页):总结不同场景下应选择哪种数据结构或算法进行问题解决。 #### 结语 《数据结构与算法分析》不仅是一本优秀的教科书,也是任何希望深入了解数据结构和算法领域...
"数据结构与算法学习指南" 本书《Hello 算法》是为了帮助读者学习数据结构与算法而编写的,作者靳宇栋(Krahets)认为刷题虽然是学习算法的一种方法,但对于基础不足的同学来说,可能会感到困扰和挫折。因此,本书...
在《数据结构算法与应用--C++语言描述》这本书中,作者深入浅出地介绍了各种基本和高级的数据结构及其对应的算法,并提供了详细的C++实现。以下是基于这个主题的详细知识点讲解: 1. **数组**:数组是最基础的数据...
逻辑结构:描述数据元素之间的逻辑关系,如线性结构(如数组、链表)、树形结构(如二叉树、堆、B树...学习算法与数据结构不仅有助于理解程序的内部工作原理,更能帮助开发人员编写出高效、稳定和易于维护的软件系统。
在编程竞赛、数据结构与算法的学习中,选择排序是一个基础概念,有助于理解排序算法的基本原理。在实际编程中,尽管选择排序并不常用,但对于学习者来说,它是理解其他更高效排序算法(如快速排序和归并排序)的良好...
本文档主要聚焦于初级水平的数据结构与算法的学习,适用于初学者掌握基础概念和技术要点。主要内容包括栈、队列、链表等基本数据结构以及递归的概念,并详细介绍了几种排序算法的实现方式。 #### 一、基本概念 **...
以下是基于标题“数据结构与算法-java”及描述中提到的“数据结构与算法分析_Java语言描述高清版(第2版)1.pdf”所涵盖的一些关键知识点: 1. **数据结构**: - **数组**:最基础的数据结构,存储固定大小的同类型...
常见的算法有排序(如冒泡排序、选择排序、插入排序、快速排序、归并排序)、搜索(如线性搜索、二分搜索)、图算法(如深度优先搜索DFS、广度优先搜索BFS、最短路径算法Dijkstra、Floyd-Warshall)等。理解和掌握...
数据结构的选择直接影响着算法的效率和程序的质量。 - **线性表**: 包括数组和链表等,是最基本的数据结构之一。 - **栈和队列**: 栈是一种后进先出(LIFO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。 - **...
"数据结构--排序--思维导图" 数据结构中排序是指将一组无序的记录序列按照一定的规则排列成有序的序列,排序的目的是为了提高数据的存储和检索效率。排序算法的稳定性是指在排序过程中,如果待排序表中有两个元素Ri...
在编程领域,数据结构与算法是核心组成部分,它们直接影响到程序的效率和性能。Java作为广泛应用的编程语言,其在实现数据结构和算法时有着丰富的库支持和优秀的可读性。下面将对标题和描述中提到的一些关键知识点...
- 电子课件可能包括PPT讲解、示例代码、练习题和解答,帮助学习者全面掌握数据结构和算法的理论与实践。 通过学习这些内容,你可以提升编程能力,更好地理解和解决实际问题,为未来的软件开发打下坚实基础。记得...
本资料包“数据结构与算法-C语言版本”聚焦于通过源码实例和答案解析,帮助学习者深入理解数据结构的原理和算法的应用。 1. **数据结构**: - **线性结构**:如数组和链表,是数据元素间存在一对一关系的结构。...