经典排序算法——选择排序(python代码实现)

目录

选择排序

基本思想

性能特点

步骤详解

python代码


选择排序

        选择排序是一种十分基础的的排序算法,比较简单直观。当对数据量较少的序列实现升序或降序排序是可以采用选择排序。

基本思想

        从头到尾扫描所有的n个元素,从中找出最小或最大的元素并和第一个元素进行交换,然后从除第一个以外的n-1个元素中扫描,找出最小或最大的元素并和第一个(n-1个中)元素进行交换,不断迭代此操作剩下的元素,最终就是一个有序的序列。

排序步骤图

性能特点

平均时间复杂度 最好情况 最坏情况 空间复杂度 排序方式 稳定性
O(n^{2}) O(n^{2}) O(n^{2}) O(1) In-place 不稳定

步骤详解

待排序列:1,42,65,876,34,656,4

1 42 65 876 34 656 4

升序排序 

第一趟排序:待排序列中1为最小元素,且1本来就在最小元素位置,则不发生元素交换。

已经有序{},剩下待排序序列{1,42,65,876,34,656,4}

min
扫描 1 42 65 876 34 656 4
排序 1 42 65 876 34 656 4

第二趟排序:剩下待排序列中4为最小元素,则把4交换到最小元素位置上。

已经有序{1},剩下待排序序列{42,65,876,34,656,4}

min
扫描 1 42 65 876 34 656 4
排序 1 4 65 876 34 656 42

第三趟排序:剩下待排序列中34为最小元素,则把34交换到最小元素位置上。

已经有序{1,4},剩下待排序序列{65,876,34,656,42}

min
扫描 1 4 65 876 34 656 42
排序 1 4 34 876 65 656 42

第四趟排序:剩下待排序列中42为最小元素,则把42交换到最小元素位置上。

已经有序{1,4,34},剩下待排序序列{876,65,656,42}

min
扫描 1 4 34 876 65 656 42
排序 1 4 34 42 65 656 876

第五趟排序:剩下待排序列中65为最小元素,且65本来就在最小元素位置,则不发生元素交换。

已经有序{1,4,34,42},剩下待排序序列{65,656,876}

min
扫描 1 4 34 42 65 656 876
排序 1 4 34 42 65 656 876

第六趟排序:剩下待排序列中656为最小元素,且656本来就在最小元素位置,则不发生元素交换。已经有序{1,4,34,42,65},剩下待排序序列{656,876}

min
扫描 1 4 34 42 65 656 876
排序 1 4 34 42 65 656 876

有序序列:待排元素只剩下一个,则整个序列已经是有序序列了。

已经有序{1,4,34,42,65,656},剩下待排序序列{876},此时整个序列已经有序{1,4,34,42,65,656,876}

1 4 34 42 65 656 876

python代码

升序

# 选择排序
def selectionSort(arr):
    for i in range(len(arr) - 1):
        minIndex = i  # 记录最小元素的索引
        # 找出最小元素
        for j in range(i + 1, len(arr)):  
            if arr[j] < arr[minIndex]:
                minIndex = j
        # i不是最小元素时,将i和最小元素进行交换
        if i != minIndex:
            arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr


if __name__=="__main__":
    nums = [1, 42, 65, 876, 34, 656, 4, 6757, 89, 24, 65, 42]
    print("start:", nums)
    print("冒泡 :", selectionSort(nums))

降序

# 选择排序
def selectionSort(arr):
    for i in range(len(arr) - 1):
        maxIndex = i  # 记录最大元素的索引
        # 找出最大元素
        for j in range(i + 1, len(arr)):
            if arr[j] > arr[maxIndex]:
                maxIndex= j
        # i不是最大元素时,将i和最大元素进行交换
        if i != maxIndex:
            arr[i], arr[maxIndex] = arr[maxIndex], arr[i]
    return arr


if __name__=="__main__":
    nums = [1, 42, 65, 876, 34, 656, 4, 6757, 89, 24, 65, 42]
    print("start:", nums)
    print("冒泡 :", selectionSort(nums))

猜你喜欢

转载自blog.csdn.net/qq_41750911/article/details/125094330