================================================
博主github:https://github.com/MichaelBeechan
博主CSDN:https://blog.csdn.net/u011344545
================================================
冒泡排序
- 如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。
- 比较两个相邻的元素,将值大的元素交换到右边
def BubbleSort(x):
i = len(x) - 1
while i > 0:
j = 0
while j < i:
if x[j] > x[j + 1]:
swap(x,j,j+1)
j += 1
i -= 1
return x
def bubbleSort(list):
for i in range(1, len(list)):
for j in range(0, len(list)-i):
if list [j] > list [j+1]:
list [j], list [j + 1] = list [j + 1], list [j]
return list
冒泡排序法改进
- 在最好的情况下,冒泡排序法依然会执行每个循环但不进行任何交换操作,可以设定一个标记判断冒泡排序法在一次内层循环中是否进行了交换,如果没有,说明算法已经使排好序的,就可以直接返回,不过这种方法只是对最好的情况进行了改进。
def BubbleSort_1(x):
i = len(x) - 1
while i > 0 :
flag = False
j = 0
while j < i:
if x[j] > x[j + 1]:
swap(x,j,j+1)
flag = True
j += 1
if not flag:
return x
i -= 1
return x
双向冒泡排序法
C语言 | 快排双向扫描:快速排序双向扫描分区法(源代码)
- 双向冒泡排序法由两个方向同时进行冒泡,首先由左向右为大元素移动方向,从右向左为小元素移动方向,然后每个元素都依次执行。在第i次移动后,前i个和后i个元素都放到了正确的位置。
def BidirectionalBubbleSort(x):
i = 0
while i<= len(x)//2:###两侧一起向中心移动,因此为一半
flag = False
for j in range(i ,len(x) - i - 1):
if x[j]>x[j+1]:
swap(x, j, j+1)
flag=True
for j in range(len(x)- 1 - i,i,-1):
if x[j]<x[j-1]:
swap(x, j, j-1)
flag=True
if not flag:
return x
i += 1
return x
插入排序
- 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。
- 插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
def InsertionSort(x):
i = 1
while i < len(x):
j = i - 1
item = x[i]
while j >= 0 and item < x[j]:
x[j + 1] = x[j]
j -= 1
x[j + 1] = item
i += 1
return x
希尔排序(插入排序改进)
- 插入排序在顺序以及比较好的情况下效率高,但其大部分情况是低效率的,因为每次智能移动一位数字,希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
- 希尔算法的逻辑是,先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序,具体步骤如下: 1.设定一个较大间隔gap,对所有间隔为gap的数据通过插入排序法进行排序; 2.执行完之后根据某种逻辑缩小gap(代码中采用除以3取整的办法),重复上述过程,直到gap = 0。
- 通过以上步骤,最终得到的列表是排好序的,并且可以证明,这种方法的平均的复杂度是O(nlogn)。
def HashSort(x):
gap = round(len(x)*2/3)
while gap > 0 :
print('gap = ',gap )
i = gap
while i < len(x):
j = i - gap
item = x[i]
while j >= 0 and item < x[j]:
x[j + gap] = x[j]
j -= gap
x[j + gap] = item
i += 1
gap = round(gap/3)
return x