当前位置: 首页 > 后端技术 > Python

常用排序算法和二分查找(Python实现)

时间:2023-03-26 11:48:43 Python

这里的代码仅供参考。写作方法不是唯一的。如有不妥请在下方评论,我看到后会第一时间更正。1.冒泡排序冒泡排序就是每次比较相邻的两个元素。从头到尾遍历一轮后,至少会选择最大的元素放在最后。然后像这样循环n-1次。代码需要两层循环,外层循环代表需要遍历的次数,内存循环代表每次遍历需要进行两两比较的次数。defbubble_sort(list_2):n=len(list_2)"""从头到尾的次数为n-1"""forjinrange(n-1):"""从头到尾的次数timestojudgeeachtimeisn-1"""foriinrange(n-1-j):iflist_2[i]>list_2[i+1]:list_2[i+1],list_2[i]=list_2[i],list_2[i+1]返回list_2test_list=[1,10,44,23,43,33,89,20,90,27,23,13,45,92,67,71]print(bubble_sort(test_list))2.选择排序选择排序就是每次默认最前面的元素最小,遍历一轮,如果有比它小的就交换位置。经过一轮遍历,至少会选择最小的元素。下一次遍历从最小元素的下一个元素开始。defselect_sort(test_list):n=len(test_list)forjinrange(n-1):"""每次遍历,比较的次数都会减少,所以使用range(n-1-j)"""foriinrange(n-1-j):"""test_list[i+1+j]每遍历一次,比较的第一个数的index会越来越大"""iftest_list[i+1+j]0:"""插入并排序每个组中的元素"""forjinrange(gap,n):"""插入并排序组中的元素"""whilej>0:iftest_list[j]=,因为low-1可能小于first"""iffirst>=last:returnlow=firsthigh=lastmid_value=test_list[第一]whilelow=mid_value:high-=1test_list[low]=test_list[high]whilelow=0:ifheap[last_idx]>heap[father_idx]:heap[last_idx],heap[father_idx]=heap[father_idx],heap[last_idx]else:breaklast_idx=father_idxfather_idx=(last_idx-1)//2defheap_sort():#heapres=[]last_idx=len(heap)-1whileheap:#交换第一个和最后一个元素,然后弹出最后一个元素。然后头节点向下冒泡heap[0],heap[last_idx]=heap[last_idx],heap[0]res.append(heap.pop())now_idx=0length=len(heap)while2*now_idx+1rootnodevalue,exchangeifleft_indexunsorted[largest]:largest=left_index#如果右子节点存在,且右子节点值>rootnodevalue,exchangeifright_indexunsorted[largest]:largest=right_index#至少进行过一次根节点和子节点交换。递归地处理它的子节点。iflargest!=index:unsorted[largest],unsorted[index]=unsorted[index],unsorted[largest]heapify(unsorted,largest,heap_size)defheap_sort(unsorted):#作为最大堆处理n=len(unsorted)foriinrange(n//2-1,-1,-1):#从倒数第二层到顶部处理。heapify(unsorted,i,n)#交换顶节点和尾节点,重新调整为最大堆foriinrange(n-1,0,-1):unsorted[0],unsorted[i]=unsorted[i],unsorted[0]heapify(unsorted,0,i)#注意这里的i,即尾部保持从堆顶依次弹出的节点returnunsortedif__name__=="__main__":unsorted=[0,5,3,2,2,6,10,4,8]print(heap_sort(unsorted))#[0,2,2,3,4,5,6,8,10]8.二进制搜索defbinary_search(test_list,item):low=0high=len(test_list)-1whilelow<=high:guess=(low+high)//2iftest_list[guess]==item:print("找到,索引值为:",guess)returneliftest_list[guess]