选择排序对数组进行排列(c/c++)

84 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

1.内存的工作原理

假设你去看演出,需要将东西寄存。寄存处有一个柜子,柜子有很多抽屉。每个抽屉可放一样东西,你有两样东西要寄存,因此要了两个抽屉。你将两样东西存放在这里。现在你可以去看演出了!这大致就是计算机内存的工作原理。计算机就像是很多抽屉的集合体,每个抽屉都有地址。

需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存
储多项数据时,有两种基本方式——数组和链表。但它们并非都适用于所有的情形,因此知道它
们的差别很重要。这就要进一步分析数组和链表以及它们的优缺点。

2.链表

链表中的元素可存储在内存的任何地方,链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。当我们在使用链表时,根本就不需要移动元素。因此,只要有足够的内存空间,就能为链表分配内存。

链表的优势在插入元素方面。

3.数组

链表存在一个问题,在需要读取链表的最后一个元素时,不能直接读取,因为你不知道它所处的地址,必须先访问第一个地址,从而获取第二个元素的地址,在访问元素二来获取元素三的地址,以此类推,直到访问最后一个元素。需要同时读取所有的元素时,链表的效率跟数组差不多,但如果需要跳跃,链表的效率极低。

但是数组不一样,如一个数组里有五个元素,第一个地址为1,那么第五个元素的地址就为5.只需要执行简单的运算即可得出。需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。

4.选择排序

假设我们的电脑存储了很多乐曲,对于每个乐队,我们都记录了其作品的被播放次数。我们将这个列表按播放次数从多到少的顺序排列,一种办法是遍历这个列表,找出作品播放次数最多的乐队,并将该乐队添加到一个新列表中。再这样做,找出播放次数第二多的乐队。一直到最后,我们可以得到一个有序列表。

要找出播放次数最多的乐队,必须检查列表中的每个元素。这需要的时间为O(n)。因此对于这种时间为O(n)的操作,需要执行n次。需要的总时间为 O(n × n),即O(n2)。

image.png

#include<iostream>
using namespace std;
int findSmallest(int arr[],int size);

int main()
{
	int a[] = { 5,3,2,6,34,68,23 };
	int length = sizeof(a) / sizeof(a[0]);
	findSmallest(a,length);
}
int findSmallest(int arr[],int size)
{
	int newarr[] = { 0 };
	int changdu = size;
	for (int p = 0; p < changdu; p++)
	{
		int a = arr[0];
		int j = 0;
		for (int i = 1; i < size; i++)
		{
			if (a > arr[i])
			{
				a = arr[i];
				j = i;
			}
		}
		newarr[p] = arr[j];
		for (int m = j + 1; m < size; m++)
		{
			arr[j] = arr[m];
		}
		size = size - 1;
	}
	for (int i = 0; i < changdu; i++)
	{
		cout << newarr[i] << ' ';
	}
	return 0;
}

5.总结

计算机内存犹如一大堆抽屉。

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