算法初步-排序算法-选择排序

        选择排序表示从无序的数组中,每次选择最小或最大的数据,从无序数组中放到有序数组的末尾,以达到排序的效果。

        选择排序的平均时间复杂度是O(n2),最好情况下的时间复杂度和最坏情况下的时间复杂度都是O( n2 )。他是不稳定排序算法。

        选择排序的过程如图1所示,我们仍以递增排序的算法为例,先遍历未排序的数组,找到最小的元素。然后,把最小的元素从未排序的数组中删除,添加到有序数组的末尾。

算法初步-排序算法-选择排序_第1张图片

图1

         如图2所示,我们继续对剩余元素进行遍历。这次,最小的元素是2。我们把它添加到已排序的数组末尾。由于已在有序数组中的元素必定小于未排序数组中的所有元素,所以这步操作是正确无误的。

算法初步-排序算法-选择排序_第2张图片

图2

         如图2-6所示,重复上述步骤,当未排序数组中只剩下一个元素时,把它添加到已排序的数组末尾,整个数组的排序就完成了。

        以下代码采用图1和图2中的思路,将数组nums进行正序排序。

nums=[5,2,4,5,1,2,3]
res=[]
while len(nums):
    minInd =0
    for i in range(1,len(nums)):
        if(nums[i]

        虽然这样实现排序较为直观,代码逻辑也比较简单,但可以注意到,这样实现插入排序需要两个同样大小数组的空间。如果要处理的数据量较大,这样的算法会浪费资源。所以,我们要对算法做一些改动,使选择排序能够在同一个数组内完成。同样地,我们用图来展示这个过程。

        首先,如图3所示,在未排序的数组中找到最小的数1。

 图3

 如图4所示,我们把它与数组的第一个元素交换

    图4

        这时候,数组中的第一个位置就成了有序数组的一部分。

算法初步-排序算法-选择排序_第3张图片

  图5

 如图6和图7所示,2和第二个元素交换位置后,第二个位置就成了这个有序数组的一部分。算法初步-排序算法-选择排序_第4张图片

 图6

 算法初步-排序算法-选择排序_第5张图片

 图7

         继续重复以上步骤,直到所有元素都被加入到有序数组中。如图8所示,下面给出了确定第三小的数并将其排序的过程。算法初步-排序算法-选择排序_第6张图片

图8

 现在对之前的代码做如下改进

nums=[5,2,4,5,1,2,3]
for i in range(len(nums)-1):
    min=i
    for j in range(i,len(nums)):
        if(nums[j]>nums[min]):
            min=j
    nums[i],nums[min]=nums[min],nums[i]
print(nums)

 

你可能感兴趣的:(算法分析与设计,排序算法)