选择排序小谈

选择排序顾名思义(以递增排序为例,使用Python语言):选择(选择最小的元素) + 排序(放置选择到的数到相应位置)

1. 选择——在一堆数字之中找到最小的数是很容易完成的:

def min(list):
    min = 0
    for i in range( len(list) ):
        if list[min] > list[i]:
           min = i 
    return min

list = [3, 4, 5, 9, 2]
index = min(list)
print list[index], index

使用函数的方式供下面步骤调用。


2.排序——将数字放置到合适的位置有很多种方法:

其一:生成一个新列表,每找到一个最小值就加入到新列表的最后——使用append函数(其中要注意把找到的最小值从原列表中剔除)。整个实现如下:

lst = [3, 4, 5, 9, 2, 6, 7, 8, 20, 10]
list_done = list()

for i in range( len(lst)):
    mi = min(lst)
    list_done.append( lst[mi] )
    
    lst.pop( mi)

print list_done

其二:与列表中的第一个交换。

列表中有多少数,就要循环多少次(当然最后一个数似乎没有必要比较自然而然的就是最大的),每次循环都将找到的最小的数与子列表 的第一个进行交换。

(子列表:每一次循环都刨除第一个数,因为第一个数就是之前找到的最小的数放到第一位的,第一次循环的子列表就是整个列表。子列表使用Python的切片操作实现)

def swap(i, mi):
    print 'current i , mi is:',lst[i],lst[mi]
    temp = lst[i]
    lst[i] = lst[mi]
    lst[mi] = temp
    
lst = [3, 4, 5, 9, 2, 6, 7, 8, 20, 10,1, 0, 50, 5]

for i in range( len(lst) ):
    nLst = lst[i:]
    print 'current the list is:', lst
    print 'current the sub list is:', nLst
    print 'current index is:', i
    mi = min( nLst )
    swap(i, mi+i)   #use index as parameter or will cause mistake

print lst
注意细节上的逻辑错误,在swap中,第二个参数不能够直接传mi,因为 mi 是在砍掉了 i 项之后的 nLst 中的位置 ≠ lst中的位置, 所以需要给mi 补上 i 才是 lst 中正确的位置。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当谈到排序算法时,有许多经典的排序算法可以使用。以下是十大常见的排序算法及其详细解释,使用Python编写的示例代码: 1. 冒泡排序(Bubble Sort): 冒泡排序是一种简单的交换排序算法。它重复地遍历要排序的列表,比较相邻的元素并交换它们,直到整个列表排序完成。 ```python def bubble_sort(arr): n = len(arr) for i in range(n-1): for j in range(n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] return arr ``` 2. 选择排序(Selection Sort): 选择排序是一种简单直观的排序算法。它将列表分为已排序和未排序两部分,每次从未排序部分选择最小的元素,并将其放入已排序部分的末尾。 ```python def selection_sort(arr): n = len(arr) for i in range(n-1): min_idx = i for j in range(i+1, n): if arr[j] < arr[min_idx]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr ``` 3. 插入排序(Insertion Sort): 插入排序是一种简单且高效的排序算法。它将列表分为已排序和未排序两部分,每次从未排序部分选择一个元素,并将其插入到已排序部分的正确位置。 ```python def insertion_sort(arr): n = len(arr) for i in range(1, n): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 4. 快速排序(Quick Sort): 快速排序是一种高效的分治排序算法。它选择一个基准元素,将列表分为小于基准值和大于基准值的两部分,然后递归地对这两部分进行排序。 ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr) // 2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` 5. 归并排序(Merge Sort): 归并排序是一种稳定的排序算法,它采用分治策略将列表分为较小的部分,然后递归地合并这些部分以获得排序结果。 ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = arr[:mid] right = arr[mid:] left = merge_sort(left) right = merge_sort(right) return merge(left, right) def merge(left, right): result = [] i, j = 0, 0 while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 result.extend(left[i:]) result.extend(right[j:]) return result ``` 6. 堆排序(Heap Sort): 堆排序利用堆的性质进行排序。它将列表视为完全二叉树,并使用堆数据结构来选择最大或最小元素并将其放在正确的位置上。 ```python def heapify(arr, n, i): largest = i left = 2 * i + 1 right = 2 * i + 2 if left < n and arr[i] < arr[left]: largest = left if right < n and arr[largest] < arr[right]: largest = right if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def heap_sort(arr): n = len(arr) for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) return arr ``` 7. 计数排序(Counting Sort): 计数排序是一种稳定的整数排序算法,它使用额外的计数数组来确定每个元素在排序后的位置。它适用于元素范围较小的情况。 ```python def counting_sort(arr): max_val = max(arr) count = [0] * (max_val + 1) for num in arr: count[num] += 1 sorted_arr = [] for i in range(len(count)): sorted_arr.extend([i] * count[i]) return sorted_arr ``` 8. 桶排序(Bucket Sort): 桶排序是一种将元素分配到
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值