排序算法中面试经常遇到的算法,也是最重要的两个算法!
算法(一):快速排序
思想:通过一趟排序将待排序的记录分割成两部分,一部分关键字均大于另一部分记录的关键字,然后分别在对两部分分别进行分割,直到这个记录都是有序的为止。
做法:
(1)设置两个变量i,j,开始的时候i = 0,j = n-1
(2)将第一个数据作为基准,赋给key值,key = data[0]
(3)从j开始向前搜索,即j --,当找到第一个小于key的值,将data[j] 与data[i]交换
(4)从i开始向后搜索,即i ++,当找到第一个大于可以的值,将data[i] 与data[j]交换
(5)重复(3)(4)直达i = j
def quick_sort(data,start,end):
if start < end:
i,j = start,end
key = data[i]
while i < j:
while i < j and key >= data[j]:
j = j - 1
data[i] = data[j]
while i < j and key >= data[i]:
i = i + 1
data[j] = data[i]
data[i] = key
quick_sort(data,start,i-1)
quick_sort(data,j+1,end)
return data
算法(二)堆排序
知识点:堆是一种完全二叉树,堆有两种类型:大顶堆和小顶堆
大顶堆是每个节点的值都大于等于它的左右孩子节点的值,小顶堆是反之。
思想:
(1)创建大顶堆(小顶堆),
(2)将堆顶元素和最下最右面节点交互,剩余节点在调整为一个大顶堆(小顶堆),
(3)重复(1)(2)直到这个大顶堆(小顶堆)的长度为1
代码
def BuildMaxHeap(data,length):
for i in range(length//2,0,-1):
AdjustDown(data,i,length)
def AdjustDown(data,k,length):
data[0] = data[k]
i = 2 * k
while i <= length:
if i < length and data[i] < data[i + 1]:
i = i + 1
if data[0] >= data[i]:
break
else:
data[k] = data[i]
k = i
i = 2 * k
data[k] = data[0]
归并排序:
class solution:
def __init__(self):
self.count = 0
def InversePairs(self,data):
def Merge(a,b):
c = []#新的数组
i = j = 0#两个数组的指针
while i < len(a) and j < len(b):
if a[i] <= b[j]:
c.append(a[i])
i = i + 1#选择前面a数组的开头元素,指针后移
else:
self.count += len(a) - i
c.append(b[j])
j = j + 1#选择后面b数组的开头元素,指针后移
if i == len(a):#后面b数组还有元素
for k in b[j:]:
c.append(k)
else:#前面a数组还有元素
for k in a[i:]:
c.append(k)
return c
def Merge_sort(lst):
if len(lst) <= 1:
return lst
mid = len(lst) // 2
left = Merge_sort(lst[:mid])
right = Merge_sort(lst[mid:])
return Merge(left,right)
Merge_sort(data)
return self.count