python——选择排序

选择排序:一次遍历取出数组中最小(大)的数存储到另一个数组中,时间为O(n^2)
# 取出数组中最小的数的索引
def findSmaller(arr):
	smallest = arr[0]
	smallest_index = 0
	for i in range(1,len(arr)):
		if arr[i] < smallest:
			smallest = arr[i]
			smallest_index = i
	return smallest_index

def selectionSort(arr):
	newArr = []
	for i in range(len(arr)):
		print(arr)
		smallest_index = findSmaller(arr)
		# pop函数会将数组中最小的数抽取出来,使数组越来越小
		newArr.append(arr.pop(smallest_index))
	return newArr

arr = [5,3,6,2,10]
newArr = selectionSort(arr)
print(newArr)

### Python选择排序与冒泡排序的区别 #### 1. **定义与基本原理** - **选择排序**是一种基于选择机制的简单排序方法。其核心思想是从待排序序列中找到最小(或最大)元素并将其放置到已排序部分的末尾[^2]。 - **冒泡排序**则通过多次遍历数组,每次比较相邻的两个元素并将较大的元素向右移动,从而逐步将最大的元素“冒泡”至最后位置[^1]。 --- #### 2. **代码示例** ##### (1) 选择排序 以下是选择排序的一个标准实现: ```python def selection_sort(arr): for i in range(len(arr)): min_idx = i for j in range(i+1, len(arr)): if arr[min_idx] > arr[j]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] return arr if __name__ == "__main__": array = [64, 25, 12, 22, 11] sorted_array = selection_sort(array) print("Sorted array is:", sorted_array) ``` 此代码实现了选择排序的核心逻辑:外层循环负责固定当前索引 `i` 的值作为候选最小值;内层循环用于寻找剩余未排序部分中的实际最小值,并最终完成交换操作。 --- ##### (2) 冒泡排序 下面是冒泡排序的标准实现: ```python def bubble_sort(arr): n = len(arr) for i in range(n): swapped = False for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] swapped = True if not swapped: break return arr if __name__ == "__main__": array = [64, 34, 25, 12, 22, 11, 90] sorted_array = bubble_sort(array) print("Sorted array is:", sorted_array) ``` 该版本还引入了一个优化标志位 `swapped` 来检测某次迭代中是否有任何交换发生。如果没有,则说明数组已经完全有序,可以提前终止排序过程[^3]。 --- #### 3. **时间复杂度分析** | 排序算法 | 最优时间复杂度 | 平均时间复杂度 | 最差时间复杂度 | |----------|----------------------|--------------------|---------------------| | 选择排序 | \(O(n^2)\) | \(O(n^2)\) | \(O(n^2)\) | | 冒泡排序 | \(O(n)\) | \(O(n^2)\) | \(O(n^2)\) | - 对于 **选择排序** 而言,无论输入数据的状态如何,它都需要完整的两重嵌套循环来定位每一个最小值的位置,因此最优、平均和最差情况下的时间复杂度均为 \(O(n^2)\)。 - 在 **冒泡排序** 方面,当初始列表已经是升序排列时,仅需单次扫描即可确认无需进一步调整,此时的时间复杂度降为线性级别 \(O(n)\)。但在其他大多数情况下,尤其是反向顺序的情况下,仍会退化到平方级复杂度 \(O(n^2)\)。 此外需要注意的是,尽管两者都具有相同的渐近复杂度表现形式 (\(O(n^2)\)),但由于具体的操作细节不同——比如冒泡排序涉及频繁的数据交换而选择排序只需少量必要替换动作——它们的实际运行效率可能会有所差异[^5]。 --- #### 4. **空间复杂度对比** 无论是选择排序还是冒泡排序,二者皆属于原地排序算法,不需要额外分配存储空间来进行辅助运算,故其空间复杂度同为 \(O(1)\)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值