快速排序与二分查找
Posted 数学算法实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序与二分查找相关的知识,希望对你有一定的参考价值。
shen 今天的主要内容是同样基于分治策略的快速排序算法和在查找顺序数组时性能优越的折半查找算法
快速排序
快速排序不同于归并排序的按元素在数组中的位置对数组进行划分,而是按照元素的值对其进行划分。具体来说,快速排序的思想主要是对数组中的元素进行重新排列,来得到一个快速排序的分区。在得到的分区中,所有s下标之前的元素都小于等于A[s],之后的元素都大于等于A[s]。
如何建立分区呢?首先我们应该选定一个中轴,在中轴左边的元素小于等于中轴元素,之后大于等于中轴元素。我们首先将第一个元素作为中轴,然后分别从数组的开头和结尾分别遍历数组。
第一步从数组的第二个元素开始,如果遍历的过程中忽略小于中轴元素的值,如果找到一个大于中轴元素的值A[i],停止遍历;然后从数组的最后一个元素往前遍历数组,大于中轴元素的值忽略,如果找到一个小于中轴元素的值A[j],停止遍历
第二步,比较i和j的值,如果i<j,交换i与j位置的元素,然后i ,j加一,继续遍历知道i>=j;如果i>=j,交换中轴元素与A[j]的值,得到一个划分。
得到划分之后我们对于子数组使用同样的办法进行划分,直到得到一个有序数组。
def partition(arr,low,high):
i = ( low-1 ) # 最小元素索引
pivot = arr[high]
for j in range(low , high):
if arr[j] <= pivot:
i = i+1
arr[i],arr[j] = arr[j],arr[i]
arr[i+1],arr[high] = arr[high],arr[i+1]
return ( i+1 )
# 快速排序函数
def quickSort(arr,low,high):
if low < high:
pi = partition(arr,low,high)
quickSort(arr, low, pi-1)
quickSort(arr, pi+1, high)
折半查找
对于有序数组来说,折半查找的效率很高,它的工作方式主要是通过查找键值K和数组中间元素A[m]来完成的。如果相等,查找结束。否则,K<A[m],就对数组的前半部分进行查找,否则对数组的后半部分进行查找。
我们可以进行一个计算,检验一下折半查找的效率。对于一个有100万元素的有序数组,查找一个值,所需要的次数不会超过20次,这足以说明这个算法的优秀性能。
下面给出折半查找的python实现
def search_func(search):
low=0
high=num-1
while low<=high:
mid=(low+high)//2
if list_num[mid]==search:
print('要查找的数的第%d处'%(mid+1))
return 0
elif list_num[mid]>search:
high=mid-1
else:
low=mid+1
else:
print('未找到')
求关注 求转发
参考书籍 《算法设计与分析基础》
审稿 :傻傻小姐
侵删
以上是关于快速排序与二分查找的主要内容,如果未能解决你的问题,请参考以下文章
Java八股文面试题 基础篇 -- 二分查找算法冒泡排序选择排序插入排序希尔排序快速排序