用 Python 实现冒泡,选择,快排。
1.冒泡排序
原理:相邻元素相比较, 小的放在左边,大的放右边。
思路:依次比较相邻的两个元素, 大的放在右边。第 1 个数和第 2 个数比较, 大的放在右边,第 2 个和第 3 个比较, 大的放右边, 以此类推。第一遍结束, 最大的在最右边。在一论循环,除去最右边的的最大的放在右边第二个,类推即可排序。
代码:
def bubble_sort(my_list):
length = len(my_list)
for i in range(length - 1, -1, -1):
for j in range(0, i):
if my_list[j] > my_list[j + 1]:
exchange = my_list[j]
my_list[j] = my_list[j + 1]
my_list[j + 1] = exchange
my_list = [7, 9, 2, 6, 1, 5, -3, 2]
bubble_sort(my_list)
print(my_list)
时间复杂度: 最好情况, 若数组是正序,此时只需便利一边就可以了,所以最好时间复杂度是 o(n). 最坏情况是反序也就是需要全部走一遍, 所以时间复杂度为 O(n^2), 平均时间复杂度为 O(n^2)。
空间复杂度: O(1)
2. 选择排序
原理:通俗说就是每次循环把最小的放在最左边, 第一次循环放在左边, 第二次把剩下的循环得到第二小的放在最小的右边。
思路:第一次循环把第一个数记下, 依次和剩余的数比较,比他小的就交换,比较下来第一位就是最小的数。第二次循环把第二个数和除去第一个数和自己所有的数比较, 比第二个数小的就交换。以此类推即可。
代码:
1 def selection_sort(my_list): 2 length = len(my_list) 3 for i in range(length-1): 4 num = my_list[i] 5 index = i 6 for j in range(i+1, length): 7 if my_list[j] < num: 8 num = my_list[j] 9 index = j 10 if i != index: 11 exchange = my_list[index] 12 my_list[index] = my_list[i] 13 my_list[i] = exchange 14 15 16 my_list = [7, 9, 2, 6, 1, 5, -3, 2, 5] 17 selection_sort(my_list) 18 print(my_list)
时间复杂度: 无论最好还是最坏都需要把循环做完, 所以时间复杂度都是 O(n^2)。
空间复杂度: O(1)。
3. 快速排序.
原理: 设定一个中间数, 把比他小的放在他左边, 大的放在他右边, 递归便可以排好序。
思路: 设定第一个数为中间数,相当于给索引 1 挖了一个坑, 然后从最右边开始比中间数大的就滤过,比中间数小的就把这个数放在挖的那个坑里,同时自身也会出现一个坑。此时从左边开始遍历, 把比中间数小的滤过, 大的就放在右边那个坑里,再去右边去遍历, 比中间数小的再放左边那个坑里, 这样下去左边都小于或者等于比中间数,右边都大于或等于中间数。把数组分成两部分了这样, 在递归,就可以了。
代码:
1 def quick_sort(my_list, x, y): 2 middle_num = my_list[x] 3 while x < y: 4 while x < y and my_list[y] >= middle_num: 5 y -= 1 6 my_list[x] = my_list[y] 7 while x < y and my_list[x] <= middle_num: 8 x += 1 9 my_list[y] = my_list[x] 10 my_list[x] = middle_num 11 return x 12 13 14 def recursion(my_list, x, y): 15 if x < y: 16 middle = quick_sort(my_list, x, y) 17 recursion(my_list, x, middle - 1) 18 recursion(my_list, middle + 1, y) 19 20 21 my_list = [7, 9, 2, 6, 1, 5, -3, 2, 5] 22 recursion(my_list, 0, len(my_list)-1) 23 print(my_list)
时间复杂度: 最好情况是 O(nlogn), 最坏情况 O(n^2), 平均时间复杂度 O(nlogn)。
空间复杂度: O(logn)
浙公网安备 33010602011771号