每次在若干无序数据中查找最小数,放在无序数据的首位。
1.从N个元素的列表中找最小值及其下标,与第一个元素交换
2.从第二个元素开始的N-1个元素中找最小值及其下标,与第二个元素交换
3.以此类推,N-1轮后即为排好序的数据
a = [49,38,65,97,76,13,27,49]
for i in range(len(a)-1):
m = i
for j in range(i+1, len(a)):
if a[j] < a[m]:
m = j
temp = a[i]
a[i] = a[m]
a[m] = temp
第一轮比较:从第一个元素开始,按顺序对列表中所有N个元素中连续的两个元素进行
两两比较,如果两者不满足升序关系则交换。第一轮比较过后,最大数将下沉到列表最
后。
第二轮比较:从第一个元素开始,对列表中前N-1个元素进行两两比较,使次大数沉到
最后。
依此类推,N-1轮后,排序完毕
算法实现:
a=[77,42,35,12,101,5]
for i in range(len(a)-1):
for j in range(len(a)-1-i):
if a[j] > a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
print(a)
算法改进版:(某一轮比较中,一次交换也没有执行过,就说明已经排好序了)
a=[77,42,35,12,101,5]
for i in range(len(a)-1):
flag = True
for j in range(len(a)-1-i):
if a[j] > a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
flag = False
if flag == True:
break
print(a)
1.将包含N个元素的列表拆分成两个含N/2个元素的子列表
2.对两个子列表递归调用归并排序(最后可以将整个列表分解为N个子列表)
3.合并两个已排好序的子列表
def merge(left, right): #合并两个列表
merged = []
i, j = 0, 0 #i和j分别作为left和right的下标
left_len, right_len = len(left), len(right) #分别获取左右子列表的长度
while i < left_len and j < right_len: #循环归并左右子列表元素
if left[i] <= right[j]:
merged.append(left[i]) #归并左子列表元素
i += 1
else:
merged.append(right[j]) #归并右子列表元素
j += 1
merged.extend(left[i:]) #归并左子列表剩余元素
merged.extend(right[j:]) #归并右子列表剩余元素
print(left,right,merged) #跟踪调试
return merged #返回归并好的列表
def mergeSort(a): #归并排序
if len(a) <= 1: #空或者只有1个元素,直接返回列表
return a
mid = len(a) // 2 #列表中间位置
left = mergeSort(a[:mid]) #归并排序左子列表
right = mergeSort(a[mid:]) #归并排序右子列表
return merge(left, right) #合并排好序的左右两个子列表
a = [98,23,45,14,6,67,33,42]
a1 = mergeSort(a)
print(a1)
Python列表自带有排序算法:
a = [98,23,45,14,6,67,33,42]
a.sort() #默认升序排序
print(a) #输出[6, 14, 23, 33, 42, 45, 67, 98]
a = [98,23,45,14,6,67,33,42]
a.sort(reverse=True) #降序排序
print(a) #输出[98, 67, 45, 42, 33, 23, 14, 6]
a = [98,23,45,14,6,67,33,42]
b = sorted(a) #降序采用sorted(a,reverse=True)
print(a) #输出[98, 23, 45, 14, 6, 67, 33, 42]不变
print(b) #输出[6, 14, 23, 33, 42, 45, 67, 98]