一、选择排序
它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。
def swap(lyst,i,j):
temp=lyst[i]
lyst[i]=lyst[j]
lyst[j]=temp
def selectionSort(lyst):
i=0
while i<len(lyst)-1:
min=i
j=i
while j<len(lyst):
if lyst[min]>lyst[j]:
min=j
j+=1
if min!=i:
swap(lyst,min,i)
i+=1
对于大小为n的列表,外围循环执行了n-1次,内围循环执行n-1次到1次逐一递减,故总的次数为(n-1)+ (n-2)+...+n-(n-1)=n(n-1)/2。因此选择排序的时间复杂度是O(n^2)
二、冒泡排序
冒泡排序算法的原理如下:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
def bubbleSort(lyst):
i=0
while i<len(lyst)-1:
j=i
while j>=0:
if lyst[j]>lyst[j+1]:
temp=lyst[j]
lyst[j]=lyst[j+1]
lyst[j+1]=temp
j-=1
i+=1
时间复杂度O(n^2)
三、插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法。插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
def insertionSort(lyst):
i=1
while i<len(lyst):
itemToInsert=lyst[i]
j=i-1
while j>=0:
if lyst[j]>itemToInsert:
lyst[j+1]=lyst[j]
j-=1
else:
break
lyst[j+1]=itemToInsert
i+=1
四、快速排序
快速排序的时间复杂度为O(nlogn)~O(n^2)
def quicksort(lyst,left,right):
if left>=right:
return
key=(left+right)//2
i=left
j=right
while i<=j:
while i<=j and lyst[i]<lyst[key]:
i+=1
while i<=j and lyst[j]>lyst[key]:
j-=1
if i<=j:
temp=lyst[i]
lyst[i]=lyst[j]
lyst[j]=temp
if i<right:
i+=1
if j>left:
j-=1
quicksort(lyst,left,i-1)
quicksort(lyst,i,right)
五、合并排序
合并排序最大的优点是它的时间复杂度为O(nlogn),这个是我们之前的选择排序和插入排序所达不到的。他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化。他的唯一缺点是,需要利用额外的N的空间来进行排序。
归并排序采用分而治之的原理:
- 将一个序列从中间位置分成两个序列;
- 在将这两个子序列按照第一步继续二分下去;
- 直到所有子序列的长度都为1,也就是不可以再二分截止。这时候再两两合并成一个有序序列即可。
def merge(lyst1,lyst2):
c=[]
i=0
j=0
while i<len(lyst1) and j<len(lyst2):
if lyst1[i]<lyst2[j]:
c.append(lyst1[i])
i+=1
else:
c.append(lyst2[j])
j+=1
while i<len(lyst1):
c.append(lyst1[i])
i+=1
while j<len(lyst2):
c.append(lyst2[j])
j+=1
return c
def mergesort(lyst):
if len(lyst)<=1:
return lyst
middle=len(lyst)//2
left=mergesort(lyst[:middle])
right=mergesort(lyst[middle:])
return merge(left,right)