早些时候,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