二、选择排序

数组(Array)

数组特点

所谓数组,就是相同数据类型的元素按一定顺序排列的集合,数组的 存储区间是连续的,占用内存比较大,故空间复杂的很大。但数组的二分查找时间复杂度小,都是O(1);

数组的特点是:查询简单,增加和删除困难。

1.插入数据和删除数据效率低

​ 插入数据时,待插入位置的元素和他后面的所有元素都需要向后移动

​ 删除数据时,待删除位置后面的所有元素都需要向前移动

2.随机访问效率很高,时间复杂度可以达到O(1);

​ 因为数组的内存是连续的,想要访问那个元素,直接从数组的首地址向后偏移就可以访问到了

3.数组开辟的空间,在不够使用的时候需要进行扩容,扩容的话,就涉及到需要把旧数组中的所有元素向新数组中搬移

4.数组的空间是从栈分配的。(栈:先进后出)

数组的优点

随机访问性强,查找速度快,时间复杂度是O(1)

数组的缺点

1.从头部删除、从头部插入的效率低,时间复杂度是O(n),因为需要相应的向前搬移和向后搬移。

2.空间利用率不高

3.内存空间要求高,必须要有足够的连续的内存空间。

4.数组的空间大小是固定的,不能进行动态扩展。

链表(ListNode)

链表的特点

所谓链表,链表是一种物理存储单元上非连续、非顺序的存储结构, 数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。

链表由一系列节点(链表中每一个元素称为节点)组成,节点可以在运行时动态生成。每个节点包括两部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。相比于线性表顺序结构,操作复杂

链表:链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(n)

链表的特点:查询相对于数组困难,增加和删除容易。

1.在内存中,元素的空间可以在任意地方,空间是分散的,不需要连续。

2.链表中的元素有两个属性,一个是元素的值,另一个是指针,此指针标记了下一个元素的地址。每一个数据都会保存下一个数据的内存地址,通过该地址 就可以找到下一个数据

3.查找数据时间效率低,时间复杂度是O(n)

​ 因为链表的空间是分散的,所以不具有随机访问性,如果需要访问某个位置的数据,需要从第一个数开始找起,依次往后遍历,直到找到待查询的位置,故可能在查找某个元素时,时间复杂度是O(n)

4.空间不需要提前指定大小,是动态申请的,根据需要动态的申请和删除内存空间 ,扩展方便,故空间利用率较高。

5.任意位置插入元素和删除元素时间效率较高,时间复杂度是O(1)

6.链表的空间是从堆中分配的。(堆:先进先出,后进后出)

链表的优点

1.任意位置插入和删除元素的速度快,时间复杂度是O(1)

2.内存利用率高,不会浪费内存

3.链表的空间大小不固定,可以动态扩展

链表的缺点

随机访问效率低,时间复杂度是O(n)

总之:
在同一个数组中,所有元素的类型都必须相同(都为int、double等)。
对于想要快速访问数据,不经常有插入和删除元素的时候,选择数组
对于需要经常的插入和删除元素,而对访问元素时的效率没有很高要求的话,选择链表

选择排序

定义:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。 [

选择排序思路

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕

具体实现方法

①初始状态:无序区为R[0…n-1](共n个元素),有序区为空。

②第1趟排序

设置一个变量i,让i从0至n-2循环的同时,在对比数组中元素i跟元素i+1的大小,如果R[i+1]比R[i]小,则用一个变量k来记住他的位置(即k=i+1)。等到循环结束的时候,我们应该找到了R中最小的那个数的位置了。然后进行判断,如果这个最小元素的不是R的第一个元素,就让第一个元素跟他交换一下值,使R[0…0]和R[1…n-1]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

……

③第i趟排序

第i趟排序开始时,当前有序区和无序区分别为R[0…i-1]和R[i…n-1]。该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,使R[0…i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。

代码实现

static int[] array = {3,2,4,1,5,0};
	public static void choseSort(int[] a) {
		int max=0;
		int index=0;
		//外层循环,控制选择的次数,数组长度为6,
		for (int i = 0; i < a.length-1; i++) {
			for (int j = 0; j < a.length-i-1; j++) {
				if (max<a[j]) {//比较大小,将较大值和它的下标赋值给max
					max=a[j];
					index=j;
				}
				
			}
			int temp=a[a.length-i-1];//将第i次循环中 较大值、最后一位的值和下标交换
			a[a.length-i-1]=max;
			a[index]=temp;
			//将max index清0
			max=0;
			index=0;
			System.out.println("经过第"+i+"轮选择后,数组是:"+Arrays.toString(a));
		}
	}

小结

  1. 数组的元素都在一起。
  2. 需要存储多个元素时,可使用数组或链表。
  3. 链表的元素是分开的,其中每个元素都存储了下一个元素的地址。
  4. 数组的读取速度很快。
  5. 链表的插入和删除速度很快。
  6. 在同一个数组中,所有元素的类型都必须相同(都为int、double等)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值