选择排序

早些时候,mmccarthy很友善,可以发表一篇简短的文章来解释Bubble Sort。 如她所说,这是一个相对较慢的排序算法。 在这里,我将尝试介绍一种称为选择排序的算法,速度稍快一些。

假设您有一个随机排列的数字列表。 您想按递增顺序对这些数字进行排序-也就是说,每个元素都小于或等于下一个元素。 因此,第一个元素保持最小值,第二个元素保持第二最小值,依此类推。

因此,要确定第一个元素的内容,我们必须在列表的其余部分中找到最小值。 完成此操作后,我们可以将这个最小值与第一个元素交换。 现在第一个元素已完成排序,我们可以继续其余列表。

可以重复此基本过程,将原始数组的第二个元素视为较小数组中的第一个元素。

为了帮助可视化,假设我们有一个包含5个元素的数组,如下所示:

索引:0 1 2 3 4

数组:5 8 2 3 1

为了确定排序后的数组中的第一个元素,我们必须在其余数组中找到最小的元素。 这是Array [4]或1。因此,我们切换这些值以获得'new'数组:

索引:0 1 2 3 4

数组:1 8 2 3 5

现在我们考虑从1到4的子数组。要确定该数组的“第一个元素”,我们找到1-4范围内的最小元素。 这发生在Array [2]或2处。因此我们切换以下值:

索引:0 1 2 3 4

数组:1 2 8 3 5

以相同的方式继续,然后我们将Array [3]与Array [2]切换,然后将Array [4]与Array [3]切换以获得最终的排序数组:

索引:0 1 2 3 4

数组:1 2 3 5 8

现在,如何将其放入代码中? 我通常使用2个嵌套的for ... loops实现此算法。 第一个循环从0到n-1,其中n是数组的大小。 这是因为我们必须单独考虑每个子数组Array(i),以使Array(i)包含Array [i],Array [i + 1],Array [i + 2] ... Array [n-1 ] 排序。 当我们检查每个子数组时,我们必须有一个变量来保持找到的最小值的位置。 这将在第二个循环的整个执行过程中发生变化。 在开始检查任何值之前,我们假定最小值为Array [i],因此最小值包含i。 这很有意义-我们只检查了一个值,因此该值必须最小。

第二个for循环将从i(第一个循环的索引)变为n-1。 该循环在子数组Array(i)中找到最小的元素。 我们说这个循环使用j作为其索引。 这意味着我们必须检查Array [j]是否小于Array [smallest]-如果是,则我们发现了一个新的最小值,并且必须将j分配给smallest。

一旦第二个循环完成执行,我们知道最小包含Array(i)中最小值的索引。 然后,我们在Array [i](Array(i)中的第一个元素)和Array [smallest](Array(i)中的最小元素)处交换值。 现在,我们完成了第一个for循环的执行。

在伪代码中,以上内容变为:

void SELECTIONSORT(int array[], int n) { // n is the size of the array
   FOR (i loops from 0 to n-1)
      int smallest = i
      FOR (j loops from i to n-1)
         IF (array[j] is smaller than array[smallest])
            smallest = j
      SWAP(array, i, smallest)
}
为了简化代码,我使用了一个SWAP函数,它将交换数组中的元素。 这是一个简短的函数,看起来像这样:
void SWAP(int array[], int from, int to) {
   int temp = array[from];
   array[from] = array[to];
   array[to] = temp;
}

From: https://bytes.com/topic/java/insights/642949-selection-sort

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值