python第三十二天-----算法

算法(Algorithm):一个计算过程,解决问题的方法
时间复杂度:用来评估算法运行效率的一个东西
ps:在日常使用中,请使用sort(),because no zuo no die!

1.冒泡排序:
指针如同气泡一样一个个由下向上浮,每次上浮如果上面的数比自己小则交换位置,这样就保证每次可以使最大的数字排列在最上面,重复此过程直到所有数有序;时间复杂度为O(n2),wtf,平方怎么打,就酱吧。

1 def bubble_sort_x(data):
2     for i in range(len(data)-1):                        # 在循环到最后一个数的时候就不需要再比较了,因为此时列表已经排列好了
3         for j in range(len(data)-i-1):                    # 指针一点点上浮的过程
4             if data[j] > data[j+1]
5             data[j+1], data[j] = data[j], data[j+1]

"调优后",但是你会发现并不是真正的调优,时快时慢,因为此调优仅对当某次交换完成后发现下面的数并未进行交换(也就是已经排序好了),那么就可以认为已经完成可以返回了,但是因为是这种特殊情况并不是每次都会出现,但是每次循环你必须要做一次判断,so,这个时间开销却是必须的,因此权衡利弊这下,北神还是觉得上面的好,简单易懂,萌萌哒。

1 def bubble_sort(data):
2     for i in range(len(data)-1):
3         exchange = False
4         for j in range(len(data) - i - 1):
5             if data[j] > data[j+1]:
6                 data[j], data[j+1] = data[j+1], data[j]
7                 exchange = True
8         if not exchange:
9             return

2.选择排序:
默认以无序区第一个数为列表内的最小数,然后遍历列表开始跟默认比较大小,如果发现了比默认值小的则成为新的默认最小数,遍历完成后会发现列表中的最小数再与第一个数互换位置,重复此过程就可以保证列表从第一个数开始由小到大排序;时间复杂度为O(n2),运行时间比冒泡快,因为它与冒泡一样都对数就行了比较,但是并没有直接互换位置,直到一次循环完成后找到了最小数才进行了一次位置互换,so,冒泡排序被吊打了。

1 def insert_sort_x(data):
2     for i in range(len(data)-1):                            
3         min_loc = i
4         for j in range(i+1, len(data)):                        # 从下一个开始跟i比较
5             if data[j] < data[min_loc]:
6                 min_loc = j
7         data[i], data[min_loc] = data[min_loc], data[i]

3.希尔排序:
选择排序的升级版本,讲列表进行多次分段后各自进行排序,最后形成一个偏向有序的大列表,然后对整个大列表进行一次选择排序形成最终有序列表,看不懂就对了,没什么卵用。

 1 def shell_sort_x(data):
 2     gap = int(len(data) // 2)
 3     while gap >= 1:
 4         for i in range(gap, len(data)):
 5             tmp = data[i]
 6             j = i - gap
 7             while j >= 0 and tmp < data[j]:
 8                 data[j + gap] = data[j]
 9                 j -= gap
10             data[i - gap] = tmp
11         gap = gap // 2

4.快速排序:
取第一个元素x使其归位,列表分成两部分,左边都比x小,右边都比x大,然后对这两边递归进行排序。

 1 def quick_sort_x(data, left, right):
 2     mid = partition(data, left, right)                        # x归位
 3     quick_sort_x(data, left, mid-1)
 4     quick_sort_x(data, mid+1, right)
 5     
 6 def partition(data, left, right):
 7     tmp = data[left]
 8     while left < right:
 9         while left < right and data[range] >= tmp:
10             right -= 1
11         data[left] = data[right]
12         while left < right and data[left] <= tmp:
13             left += 1
14         data[right] = data[left]
15     data[left] = tmp

5.归并排序:
将数组递归切分成单个元素后对比排序合并。

 1 def merge_sort_x(data, low, high):
 2     if low < high:
 3         mid = (low + high) // 2
 4         merge_sort_x(data, low, mid)
 5         merge_sort_x(data, mid+1, high)
 6         merge(data, low, mid, high)
 7     
 8 def merge(data, low, mid, high):
 9     i = low
10     j = mid + 1
11     ltmp = []
12     while i <= mid and j <= high:
13     if data[i] < data[j]:            # 两边数依次取出比较大小
14         ltmp.append(data[i])
15         i += 1
16     else:
17         ltmp.append(data[j])
18         j += 1
19     while i <= mid:                    # 下面2个while只有一个会执行
20         ltmp.append(data[i])
21         i += 1
22     while j <= high:
23         ltmp.append(data[j])
24         j += 1
25     data[low:high+1] = ltmp

6.插入排序:
默认第一个元素是有序的,然后根据依次比较下一个元素与有序区内元素确定其位置。

1 def insert_sort_x(data):
2     for i in range(1, len(data)):
3         tmp = data[i]
4         j = i - 1
5         while j >= 0 and tmp < data[j]:
6             data[j + 1] = data[j]
7             j -= 1
8         data[j + 1] = tmp

7.堆排序:
建立一个堆,后去掉堆顶元素为最大元素放置于堆末尾(之后不参与计算),通过一次调整再次得到堆顶,循环重复此过程。

 1 def sift(data, low, high):
 2     i = low
 3     j = 2 * i + 1
 4     tmp = data[i]
 5     while j <= high:
 6         if j < high and data[j] < data[j + 1]:
 7             j += 1
 8         if tmp < data[j]:
 9             data[i] = data[j]
10             i = j
11             j = 2 * i + 1
12         else:
13             break
14     data[i] = tmp
15 
16 def heap_sort_x(data):
17     n = len(data)
18     for i in range(n // 2 - 1, -1, -1):
19         sift(data, i, n - 1)
20     for i in range(n - 1, -1, -1):
21         data[0], data[i] = data[i], data[0]
22         sift(data, 0, i - 1)
原文地址:https://www.cnblogs.com/bfmq/p/6761840.html