常用排序算法简单实践。

快速排序

思想:

对A进行排序

  • 选择A中的任意一个元素pivot,该元素作为基准
  • 将小于基准的元素移到左边,大于基准的元素移到右边(分区操作)
  • A被pivot分为两部分,继续对剩下的两部分做同样的处理
  • 直到所有子集元素不再需要进行上述步骤
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 采用左闭右闭
def quick_sort(nums,lo,hi):#nums:List[int] ,lo:int,hi:int
if lo+1>=hi:
return
first=lo
last = hi-1
pivot = nums[first]
while first<last:
while first<last and nums[last]>=pivot:
last=last-1
nums[first]=nums[last]
while first<last and nums[first]<=pivot:
first=first+1
nums[last]=nums[first]
nums[first]=pivot
quick_sort(nums,lo,first)
quick_sort(nums,first+1,hi)
1
2
3
nums=[5,4,3,1,6,5]
quick_sort(nums,0,len(nums))
nums
[1, 3, 4, 5, 5, 6]

归并排序

归并排序采用分而治之的原理:

  • 将一个序列从中间位置分成两个序列;
  • 在将这两个子序列按照第一步继续二分下去;
  • 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def merge(a, b):
c = []
h = j = 0
while j < len(a) and h < len(b):
if a[j] < b[h]:
c.append(a[j])
j += 1
else:
c.append(b[h])
h += 1

if j == len(a):
for i in b[h:]:
c.append(i)
else:
for i in a[j:]:
c.append(i)

return c

def merge_sort(lists):
if len(lists) <= 1:
return lists
middle = len(lists)//2
left = merge_sort(lists[:middle])
right = merge_sort(lists[middle:])
return merge(left, right)

if __name__ == '__main__':
a = [14, 2, 34, 43, 21, 19]
print (merge_sort(a))
[2, 14, 19, 21, 34, 43]

插入排序

将无序逐个添加至有序中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def insert_sort(arr):
"""插入排序"""
# 第一层for表示循环插入的遍数
for i in range(1, len(arr)):
# 设置当前需要插入的元素
current = arr[i]
# 与当前元素比较的比较元素
pre_index = i - 1
while pre_index >= 0 and arr[pre_index] > current:
# 当比较元素大于当前元素则把比较元素后移
arr[pre_index + 1] = arr[pre_index]
# 往前选择下一个比较元素
pre_index -= 1
# 当比较元素小于当前元素,则将当前元素插入在 其后面
arr[pre_index + 1] = current
return arr

insert_sort([11, 2,1,4,5,3,9])
[1, 2, 3, 4, 5, 9, 11]

冒泡排序

思路:依次比较相邻的元素,前者大于后者则交换,每趟将最大值交换至最右

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def bubble_sort(nums):# nums:List[int]
n = len(nums)
for i in range(1,n):
swapped = False
for j in range(1,n-i+1):
if nums[j]<nums[j-1]:

nums[j],nums[j-1]=nums[j-1],nums[j] # 两者值交换
swapped= True
if not swapped:
break
nums=[2,1,4,3,6,5]
bubble_sort(nums)
print(nums)
[1, 2, 3, 4, 5, 6]

选择排序

思路:每次选择最小者放置左边

1
2
3
4
5
6
7
8
9
10
11
def selection_sort(nums):
n = len(nums)
for i in range(n):
pos = i
for j in range(i+1,n):
if nums[j]<nums[pos]:
pos=j
nums[pos],nums[i]=nums[i],nums[pos]
nums=[3,1,2,5,4,6]
selection_sort(nums)
nums
[1, 2, 3, 4, 5, 6]