冒泡排序
冒泡排序就是从数组的最底部不断的往上寻找的过程,当下面的大于上面的就换一下,每循环一次最小的值就到了最上面一次,然后下一次循环就只需要从最底部到最上面的第二个了,代码如下:
def bubble_sort(a):
for i in range(len(a)):
for j in range(len(a)-1, i, -1):
if a[j] < a[j - 1]:
temp = a[j]
a[j] = a[j-1]
a[j-1] = temp
return a
a = [9, 1, 5, 8, 3, 7, 4, 6, 2]
bubble_sort(a)
print(a)
其中rang(xx,xx,-1)表示逆序
简单选择排序
简单选择排序与冒泡排序不同的在于此方法仅用于比较,最后再进行交换,原理:从第一个开始,将0作为最小值的记号,然后不断的往后找,找到比记号小的值,然后把当前的值记为记号,遍历完一次之后将这个记号与最初的记号相比较,如果不一样就代表找到了新的最小值,然后把标记的最小值放到最前面去,这样完成了将最小的值放到0的操作了,继续接下来的操作,代码如下:
def selectsort(a):
for i in range(len(a)):
min = i
for j in range(i+1, len(a)):
if a[min] > a[j]:
min = j
if min != i:
temp = a[min]
a[min] = a[i]
a[i] = temp
return a
a = [9, 1, 5, 8, 3, 7, 4, 6, 2]
selectsort(a)
print(a)
直接插入排序
直接插入排序需要在输入的数组内加个“哨兵”,过程就是将5 3 4 6 2 改成0 5 3 4 6 2.其中0就是哨兵,开始:从第二个数字开始,将0改为第二个数字的值,3 5 3 4 6 2,然后开始比较,从第二个减一开始,如果比哨兵的数字大,就往后移一个单位,直到不大了或者到头了,就将这个值用哨兵的值代替,看代碼把:
def insertsort(a):
a = [0] + a
# print(a)
for i in range(2, len(a)):
a[0] = a[i]
while a[i-1] > a[0]:
a[i] = a[i-1]
i = i -1
if i == 1:
a[1] = a[0]
else:
a[i] = a[0]
a = a[1:len(a)]
return a
a = [9, 1, 5, 8, 3, 7, 4, 6, 2]
a = insertsort(a)
print(a)
希尔排序
希尔排序其实挺复杂的,但是谈起希尔排序就应该想到插入排序,可以讲希尔排序就是插入排序的升级版本,原理如下,就是讲整个数组分组,将数组总长度除二作为间隔,在整个数组以间隔取到几个数字之后,将这几个数字进行直接插入排序。接下较为详细的可参照如下链接:
希尔排序介绍
代码如下:
from Data_Structure import insert_sort as insert
def shell_sort(a):
increment = len(a) // 2
while (increment != 0):
# for i in range(0, ((len(a)-1)//increment+1)*increment,increment):
for i in range(0, increment):
numpy = []
for j in range(0, (len(a) - 1 - i) // increment + 1):
numpy.extend([int(a[i + increment * j])])
numpy = insert.insertsort(numpy)
for k in range(0, (len(a) - 1 - i) // increment + 1):
a[i + increment * k] = numpy[k]
print(a)
increment = increment // 2
a = [9, 1, 5, 8, 3, 7, 4, 6, 2]
a = [55, 2, 6, 4, 32, 200, 0, 43, 3, 65, 33, 12, 9, 73, 26, 37]
a = shell_sort(a)