快捷键:Ctrl + Home 快速回到页面顶端查看目录,点击锚点,快速定位到算法。

```python
#python函数的使用
#题:有n个正整数,输出连成最大的整数串。
st = [str(x) for x in nums]
st.sort(key = cmp_to_key(lambda s1,s2:s1+s2 if s2+s1 < s1+s2 else s2+s1))
#内置的打乱顺序的函数
import random
li = [x for x in range(10)]
random.shuffle(li)
print(li)
```
**以下先介绍三种简单排序:冒泡排序、选择排序、插入排序。**
```python
'''冒泡排序
选择理由:稳定,与原位置偏离不远。
基本思想:正宗的冒泡排序,j 其实从后往前走的,不过我们比较喜欢,从下标0开始嘛,效果一样,但是要知道。默认有增加一个状态判断,如果某趟没有进行过交换,则直接结束。
时间复杂度:最好O(n),最差O(n2), 平均O(n2)
空间复杂度:O(1)
'''
def BobleSort(li):
n = len(li)
for i in range(n-1):#定义几趟排序n-1,最后一趟不比较
state = False
for j in range(n-1-i):#每趟排序的比较次数
if li[j] > li[j+1]:
li[j],li[j+1] = li[j+1],li[j]
state = True
if not state:
return li
return li
```
```python
'''简单插入排序
选择理由:稳定,基本有序。
基本思想:从第一个元素开始,不断整理顺序。
时间复杂度:最好O(n),最差O(n2),平均O(n2)
空间复杂度:O(1)
'''
def InsertSort(li):
for i in range(1, len(li)):#定义趟数n-1
tempi = li[i]; j = i
while j > 0 and tempi < li[j-1]:#for就显示不出来优势了
li[j] = li[j-1]#后面的值上移
j -= 1
li[j] = tempi
```
```python
'''简单选择排序
选择理由:不稳定,很无序,与原位置偏离较远。
基本思想:后面找到最小的值后再来交换,比冒泡排序的优点是不用交换那么多次[可能也是唯一的优点吧]。
时间复杂度:无论好差平均都是O(n2)
空间复杂度:O(1)
'''
def SelectSort(li):
for i in range(len(li)-1):#定义趟数n-1
minIndex = i
for j in range(i+1,len(li)):#定义每趟排序的比较次数
if li[minindex] > li[j]:
minindex = j
if minindex != i:
li[i],li[minindex] = li[minindex],li[i]
```
**前面三种最差都是O(n2),经过后人的不断努力,研究,速度才得以提升。排序要加快的基本原则之一,是让后一次的排序进行时,尽量利用前一次排序后的结果,以加快排序的速度。以下介绍几种进阶排序:希尔排序、堆排序、归并排序、快速排序、计数排序**
```python
'''希尔排序-缩小增量排序
选择理由:不稳定,适合基本无序的序列,内部使用了简单插入排序。
基本思想:我们比较的元素可以再远一点,即所谓的增量,等距的一些元素先排序,再逐渐过渡到整个数组,最后的增量肯定是 1,检查还有哪些没有排好序。
时间复杂度:最差O(n2),最好平均不确定(增量的选择很关键,有很多研究)
空间复杂度:O(1)
'''
import random
def ShellSort(li):
def shellInsert(li, d):#使用的是直接插入排序
n = len(li)
for front