插入sorting与selectsorting

我想了解插入sorting和selectsorting之间的区别。

他们似乎有两个组件:一个未sorting的列表和一个sorting列表。 他们似乎都从未sorting的列表中取出一个元素,并将其放入适当位置的sorting列表中。 我看到一些网站/书籍说,selectsorting做到这一点,一次换一个插入sorting只是find正确的位置,并插入它。 但是,我看到其他文章说了一些话,说插入sorting也交换。 因此,我很困惑。 有没有任何规范的来源?

select分类:

给定一个列表,获取当前元素并将其与当前元素右侧的最小元素进行交换。 选择排序

插入类别:

给定一个列表,获取当前元素并将其插入列表的适当位置,每次插入时调整列表。 这类似于在卡片游戏中安排卡片。 插入排序

时间selectsorting的复杂度总是n(n - 1)/2 ,而插入sorting具有更好的时间复杂度,因为它的最坏情况复杂度是n(n - 1)/2 。 一般来说,它会比n(n - 1)/2更less或相等的比较。

资料来源: http : //cheetahonfire.blogspot.com/2009/05/selection-sort-vs-insertion-sort.html

插入sorting和selectsorting都有一个外部循环(在每个索引上)和一个内部循环(在一部分索引上)。 内循环的每一遍都会将sorting后的区域扩展一个元素,代价是未sorting的区域,直到耗尽未sorting的元素。

不同之处在于内部循环的作用:

  • 在selectsorting中,内部循环遍布未sorting的元素。 每一遍select一个元素,并将其移动到其最终位置(在sorting区域的当前末尾)。

  • 在插入sorting中,内部循环的每个遍都遍历sorting后的元素。 sorting后的元素将被移动,直到循环find插入下一个未sorting元素的正确位置。

因此,在selectsorting中,sorting的元素在输出顺序中find,一旦find,就保持放置状态。 相反,在插入sorting中, 未sorting的元素保持放置直到按input顺序消耗,而sorting的区域的元素不断移动。

就交换而言:selectsorting在内部循环的每个过程中都进行一次交换。 插入sorting通常会在内部循环之前将要插入的元素保存为temp 为内部循环留出空间将已sorting的元素向上移一位,然后将temp复制到插入点。

这很可能是因为您正在比较链接列表的sorting和sorting数组的描述。 但我不能确定,因为你没有引用你的来源。

理解sortingalgorithm的最简单的方法往往是得到一个algorithm的详细描述(不是像“这种types使用交换,某处,我不是在说什么”)的模糊的东西,得到一些纸牌(5-10应该是足够的对于简单的sortingalgorithm),并手动运行algorithm。

selectsorting:扫描未sorting的数据,查找最小的剩余元素,然后将其交换到sorting后的数据之后的位置。 重复,直到完成。 如果对列表进行sorting,则不需要将最小元素交换位置,而是可以将列表节点从旧位置移除,并将其插入新位置。

插入sorting:紧接着sorting数据后面的元素,扫描sorting后的数据find放置的位置,并放在那里。 重复,直到完成。

插入sorting可以在其“扫描”阶段使用交换,但不必,也不是最有效的方法,除非您sorting的数据types的数组:(a)不能移动,只能复制或交换; 和(b)复制比交换更昂贵。 如果插入sorting不使用交换,它的工作方式是,你同时search的地方把新元素在那里,通过反复交换新的元素与紧前面的元素,只要前面的元素大于它。 一旦你到达一个不大的元素,你已经find了正确的位置,然后转向下一个新的元素。

两种algorithm的逻辑非常相似。 它们在数组的开头都有一个部分sorting的子数组。 唯一的区别是他们如何search下一个要放入sorting数组的元素。

  • 插入sorting下一个元素插入到正确的位置;

  • selectsortingselect最小的元素并与当前项目交换;

此外, 插入sorting是稳定的,而不是selectsorting

我在Python中实现了两个,值得注意的是它们有多相似:

 def insertion(data): data_size = len(data) current = 1 while current < data_size: for i in range(current): if data[current] < data[i]: temp = data[i] data[i] = data[current] data[current] = temp current += 1 return data 

只需稍作更改,就可以制作“selectsorting”algorithm。

 def selection(data): data_size = len(data) current = 0 while current < data_size: for i in range(current, data_size): if data[i] < data[current]: temp = data[i] data[i] = data[current] data[current] = temp current += 1 return data 

简而言之,我认为selectsorting首先在数组中search最小值,然后执行交换,而插入sorting则采用一个值并将其与每个剩余的值(在其后面)进行比较。 如果价值较小,则交换。 然后,再次比较相同的值,如果它小于后面的值,则再次交换。 我希望这是有道理的!

我会再试一次:考虑几乎sorting数组的幸运情况会发生什么。

sorting时,数组可以被认为有两个部分:左侧 – sorting,右侧 – 未sorting。

插入sorting – 选取第一个未sorting的元素,并尝试在已sorting的部分中find它的位置。 由于您从右向左search,所以可能发生的情况是,您正在比较的第一个sorting元素(最左侧,最左侧的最右侧)小于拾取的元素,因此您可以立即继续下一个未sorting的元素。

selectsorting – 选取第一个未sorting的元素,尝试find整个未sorting部分的最小元素,并在需要时交换这两个元素。 问题是,由于右边部分是未分类的,所以每次都要考虑每一个元素,因为你不可能确定是否有或者没有比拾取的元素更小的元素。

顺便说一句,这正是堆sorting改进的selectsorting – 它能够更快地find最小的元素,因为堆 。

selectsorting:当你开始build立sorting的子列表时,algorithm确保sorting后的子列表总是完全sorting的,不仅仅是它自己的元素,而且也是完整的数组,也就是sorting和未sorting的子列表。 因此,从未sorting的子列表中find的新的最小元素只会被附加在sorting的子列表的末尾。

插入sorting:algorithm再次将数组分成两部分,但这里元素是从第二部分中挑选出来的,并插入到第一部分的正确位置。 这不能保证第一部分是按照完整的数组sorting的,尽pipe在最后的传递过程中,每个元素都处于正确的sorting位置。

两种algorithm一般都是这样工作的

步骤1:然后从未sorting列表中取下一个未sorting的元素

第2步:把它放在sorting列表中的正确位置。

其中一个步骤对于一个algorithm更容易,反之亦然。

插入sorting :我们把未sorting列表的第一个元素放在sorting列表中的某个地方 。 我们知道下一个元素的位置(未sorting列表中的第一个位置),但是需要一些工作来find放置位置( 某处 )。 第一步很容易。

selectsorting :我们把这个元素从未sorting的列表中取出,然后把它放在sorting列表的最后一个位置。 我们需要find下一个元素(它最有可能不在未sorting列表的第一个位置,而是在某处 ),然后将它放在sorting列表的末尾。 第2步很容易

基本上插入sorting通过比较两个元素一次工作,selectsorting从整个数组中select最小元素并对其进行sorting。

概念上,插入sorting通过比较两个元素来对子列表进行sorting,直到整个数组被sorting,而selectsortingselect最小元素并将其交换到第一位置第二最小元素到第二位置,依此类推。

插入sorting可以显示为:

  for(i=1;i<n;i++) for(j=i;j>0;j--) if(arr[j]<arr[j-1]) temp=arr[j]; arr[j]=arr[j-1]; arr[j-1]=temp; 

selectsorting可以显示为:

  for(i=0;i<n;i++) min=i; for(j=i+1;j<n;j++) if(arr[j]<arr[min]) min=j; temp=arr[i]; arr[i]=arr[min]; arr[min]=temp; 

简而言之,

selectsorting:从未sorting的数组中select第一个元素,并将其与其余未sorting的元素进行比较。 它与Bubblesorting类似,但不是交换每个较小的元素,而是更新最小的元素索引并在每个循环结束时将其交换

插入sorting:与selectsorting相反,它从未sorting的子数组中选取第一个元素,并将其与已sorting的子数组进行比较,并插入find的最小元素,并将所有sorting的元素从其右侧排列到第一个未sorting的元素。

通俗地说,(也许是最容易理解问题的最简单的方法)

泡沫sorting类似于排队,并尝试按高度sorting。 你继续与旁边的人切换,直到你在正确的地方。 这从左边(或右边,依赖于实现)一路发生,并且继续切换,直到每个人都被sorting。

然而,在selectsorting方面,你所做的和安排一张牌相似。 你看牌,拿最小的一张,一直放在左边,等等。