入门,学习了三个排序
万字长文|十大基本排序,一次搞定
1.选择排序
先选最小的,再遍历一遍第二小的,依次进行。
def selection_sort(arr):
for i in range(len(arr)-1):
min_index = i
for j in range(i+1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
if i != min_index:
arr[min_index], arr[i] = arr[i], arr[min_index]
return arr
arr = [2,3,6,1,0,5,8]
print(selection_sort(arr))
2.插队排序(类似于扑克牌)
从数组中第二个开始,依次与前面作比较,小于前面的,就与前面交换位置,即插进去
```python
```python
def insertion_sort(array):
for i in range(len(array)):
while array[i - 1] > array[i] and i - 1 >= 0:
# array[i], array[i - 1] = array[i - 1], array[i]
key= array[i]
array[i]=array[i-1]
array[i - 1]=key
i =i-1
return array
if __name__ == '__main__':
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
print(insertion_sort(array))
计算插队排序的比较次数:
def insertion_sort(array):
a=0
for i in range(len(array)):
while array[i - 1] > array[i] and i - 1 >= 0:
# array[i], array[i - 1] = array[i - 1], array[i]
key= array[i]
array[i]=array[i-1]
array[i - 1]=key
i =i-1
a=a+1
if i != 0:#这地方容易出错,忽视掉,所以我开始多加了两次
a += 1
print(a)
return array,(a)
if __name__ == '__main__':
array = [10, 17, 50, 7,30]
# array =[3,1,4,1, 5,9,6,5]
print(insertion_sort(array))
3.归并排序(分治思想)
def mergeSort(arr):
#递归结束条件
if len(arr) == 1:
return
mid = len(arr) // 2
l = arr[:mid]
r = arr[mid:]
mergeSort(l)#递归当前左半部分
mergeSort(r)#递归当前右半部分
#注意:递归本质:递归是递归到底层再回传
i = 0
j = 0
k = 0
#把较小的数先移到新数组中
while i < len(l) and j < len(r):
if l[i] <= r[j]:
arr[k] = l[i]
i += 1
else:
arr[k] = r[j]
j += 1
k += 1
#把左边数组剩余的数移入数组
while i < len(l):
arr[k] = l[i]
k += 1
i += 1
#把右边剩余的数移入数组
while j < len(r):
arr[k] = r[j]
k += 1
j += 1
if __name__ == '__main__':
list1 = [2,5,6,1,7,3,8,4]
mergeSort(list1)
for i in list1:
print(i)