记录我学习数据结构之路(六)

选择排序思路:不像冒泡排序那样每次找到比它小的就交换,而是要选择最小的,只交换一次就够了。

代码实现如下:

public void sort(){
		int out,in,min;
		for(out = 0; out < nElement; out++){
			min = out;
			for(in = out+1; in < nElement; in++){
				if(a[in] < a[min]){
					min = in;
				}
			}
			swap(out,min);
		}
	}

选择排序最大的特点就是交换移动数据次数相当小,这样就可以节约时间。分析它的时间复杂度发现,无论最好最差的情况,其比较次数都是一样的多,第i趟排序需要进行n-i次关键字的比较,此时需要比较(n-1)+(n-2)+...+1=n(n-1)/2次。对于交换次数而言,当最好的时候,交换为0次,最差的时候,也就初始降序时,交换次数为n-1次,基于最终的排序时间是比较与交换的次数总和,因此,总的时间复杂度为O(n^2)。

虽然跟冒泡法排序的时间复杂度是一样的,但在性能上选择排序比冒泡法排序更优一些。

时间: 2024-11-14 06:24:11

记录我学习数据结构之路(六)的相关文章

记录我学习数据结构之路(七)

直接插入排序的基本操作:将一个记录插入到已经排好序的有序表中,从而得到一个新的.记录数增1的有序表. 这是书上写的操作,他是把数组的第一个位置空出来,从第二个位置开始开始放入数据,那么空出来的第一个位置就是用来暂时存放取出来的数值的.从数组的第三个位置开始取,取出来之后向前遍历,如果前一个值比它大,那么前一个人往后移动一位,直到找到不比取出来的数值大的,然后就把取出来的值插入那个值后面. 我就不用数组的第一个值作存放取出值了,数组从0位开始存,另外再声明了一个变量来存放取出来的值: public

记录我学习数据结构之路(二)

算法的定义:解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 算法的特性:输入.输出.有穷性.确定性和可行性.输入和输出:算法具有零个或多个输入和输出.有穷性:算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成.确定性:算法的每一步骤都具有确定的含义,不会出现二义性.可行性:算法的每一步都必须的可行的,也就是说,每一步都能通过执行有限次数完成. 算法的设计要求:1.正确性:算法至少应该有输入.输出和加工处理无歧义性

记录我学习数据结构之路(八)

线性表的顺序存储的缺点就是插入和删除的时候需要移动大量的数据,这是非常耗时间的.那应该换一种思路,在第一个元素的时候,就知道第二个元素的位置:在第二个的时候就找到了第三个的位置,以此类推.这样,只要记录下下一个的位置了,不管数据存在哪里,都能顺利地找到下一个结点的位置. 代码实现: /***  * 单链表节点类  * @author link  *  */ public class Node { public int iNum; public double dNum; public Node n

记录我学习数据结构之路(四)

首先写一个数组类(这个是按照从小到大排列的数组).插入操作:遍历整个数组,当找到该数据比要插入的数据后就跳出循环,然后从最后一个数据向前遍历,直到遍历到刚刚找到的那个数据项为止,每个数据往后移动一位,最后就往找到的那个位置插入该数值.删除操作:遍历数组,找到要删除的数据项,删除.查找操作:用二分查找法,每次都找到数据中间的一项,如果该项比要查找的数据大,那么把后一般的数据去掉,保留前一半的数据,然后再找前一半数据的中间项,重复这个方法直到找到为止. public class OrderArray

记录我学习数据结构之路(九)

双端链表跟传统的单链表不同的地方是,单链表就只有一个first指向头结点的,而双端链表不仅有first指向头结点,而且有一个last指向尾结点. 代码展示: public class Node { public int iNum; public double dNum; public Node next;   //指向下一个结点 public Node(int i,double d){ iNum = i; dNum = d; } public void show(){ System.out.pr

20172313 2017-2018-2 《程序设计与数据结构》第六周学习总结

20172313 2017-2018-2 <程序设计与数据结构>第六周学习总结 教材学习内容总结 学习了如何声明和使用一个数组. 学习了要进行边界检查,确保只因用数组有效范围之内的索引值. 学习了数组不同的声明方式和初始化方式. 学习了当数组保存对象时的使用. 初步学习了命令行实参的使用. 学习了如何在调用方法时怎样接受任意个数的参数. 初步学习了二维数组的使用 教材学习中的问题和解决过程 问题1:书上在介绍数组的概念时,说数组的索引值从0开始而不是从1开始能够使元素地址的计算更为简单. 问题

20172323 2018-2019-1 《程序设计与数据结构》第六周学习总结

20172323 2018-2019-1 <程序设计与数据结构>第六周学习总结 教材学习内容总结 本周学习了第10章树 10.1概述 树是一种非线性结构,有一个包含结点和边的集构成.元素保存在结点中,边则将结点连接起来. 一些术语 根结点是位于树顶层的唯一结点 位于树中较低层的结点是上一层结点的孩子,一个结点只有一个双亲 同一双亲的两个结点称为兄弟 根结点是树中唯一没有双亲的结点,没有任何孩子的结点称为叶子,其余为内部结点 结点的层是从根结点到该结点的路径长度 树的高度是指从根到叶子之间最远路

20172314 2017-2018-2 《程序设计与数据结构》第六周学习总结

20172314 2017-2018-2 <程序设计与数据结构>第六周学习总结 教材学习内容总结 数组是一个含有多个值的列表,每个值存在于数组中特定的,具有编号的位置. 数组的声明:(1)int[] xxx = new int[3];表示实例化数组xxx后,为其预留了存放三个整型值的内存空间,索引为0.1.2.(2)int[] xxx={1,2,3};表示用初始值表实例化一个数组对象,并为数组中的每个元素提供初始值. 数组作为参数:整个数组可以作为一个参数传递给一个方法,这种方法可以实际改变该

20172332 2017-2018-2 《程序设计与数据结构》第六周学习总结

20172332 2017-2018-2 <程序设计与数据结构>第六周学习总结 教材学习内容总结 学的有些晕的第八章数组 1.类似于一个列表的数组中所包含的元素被称为数组元素. 2.数组是对象,使用前必须声明数组.(声明时需要定义数据的类型.) 3.边界检查:数组的长度是不变的,若是超出会抛出ArrayIndexOutOfBoundsException异常.最容易产生的就是差1错误.(因为索引是从0开始) 4.数组的两种声明方式:①int[] grades; ②int grades[]; (第