冒泡排序算法实现与分析

版权申诉
0 下载量 91 浏览量 更新于2024-10-28 收藏 1KB ZIP 举报
资源摘要信息:"冒泡排序算法实现及分析" 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 ### 知识点一:冒泡排序基本原理 冒泡排序的基本思想是通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。 ### 知识点二:冒泡排序的优化 冒泡排序虽然简单,但是它的效率并不高,特别是对于数据量大的排序,性能很差。可以通过一些优化措施来提高冒泡排序的效率: 1. 设置标志位:在每一轮遍历中,如果没有发生任何交换操作,则说明数列已经有序,可以提前结束排序。 2. 增加一个计数器:记录每轮排序中最后一次交换的位置,该位置之后的数据不需要再参与排序。 ### 知识点三:冒泡排序的代码实现 在不同的编程语言中,冒泡排序的实现会略有不同。以标题中提到的`tst2.asm`文件为例,这可能是一个使用汇编语言编写的冒泡排序程序。在汇编语言中实现冒泡排序,需要涉及到寄存器的操作,循环结构的设计,以及内存数据的交换等。 汇编语言实现冒泡排序的一般步骤如下: 1. 初始化两个指针,一个指向数组的第一个元素,一个指向数组的第二个元素。 2. 进行比较操作,如果前一个元素比后一个元素大,则交换这两个元素的位置。 3. 将后一个指针向前移动,继续比较下一个元素。 4. 重复步骤2和3,直到所有的元素都被比较过。 5. 外层循环确保所有元素都至少被比较过一次,可以加入优化标志位判断是否需要重复遍历。 ### 知识点四:冒泡排序的时间复杂度分析 冒泡排序的时间复杂度分析主要基于其比较和交换操作的次数。在最坏的情况下,即待排序的数列是逆序的,其比较次数为\(n \times (n-1)/2\),交换次数也为\(n \times (n-1)/2\),因此时间复杂度为\(O(n^2)\)。在最好的情况下,即待排序的数列已经是有序的,只需要进行\(n-1\)次比较,没有交换,时间复杂度为\(O(n)\)。平均时间复杂度也是\(O(n^2)\)。 ### 知识点五:冒泡排序的空间复杂度分析 冒泡排序是一种原地排序算法,不需要额外的存储空间,只需要一个用于交换的临时变量,因此其空间复杂度为\(O(1)\)。 ### 知识点六:冒泡排序的应用场景 由于冒泡排序的效率较低,通常在实际应用中不会使用它来处理大量数据的排序问题。但是,由于其算法简单,且实现容易,在学习排序算法的初级阶段,冒泡排序常被用作教学示例。在数据量较小或者数据基本有序的情况下,冒泡排序的性能尚可接受。 ### 知识点七:冒泡排序在编程中的实现 在不同的编程语言中,冒泡排序的实现方式会有所不同。在高级编程语言如Python、Java、C++中,可以使用循环结构和条件判断来实现冒泡排序。而在汇编语言中,则需要更底层地处理内存数据和循环逻辑。例如,在`tst2.asm`这个汇编文件中,可能会涉及到使用x86指令集进行寄存器操作和循环跳转。 总结来说,冒泡排序是一个历史悠久且易于理解的排序算法,尽管其效率不是很高,但作为编程入门学习的案例非常适合。了解冒泡排序的原理、实现方式和性能特点,对于深入理解更复杂的排序算法有着重要的意义。

def compute_mAP(trn_binary, tst_binary, trn_label, tst_label): """ compute mAP by searching testset from trainset https://github.com/flyingpot/pytorch_deephash """ for x in trn_binary, tst_binary, trn_label, tst_label: x.long() AP = [] Ns = torch.arange(1, trn_binary.size(0) + 1) Ntest = torch.arange(1, tst_binary.size(0) + 1) print("trn_binary.size(0):",trn_binary.size(0)) print("tst_binary.size(0):", tst_binary.size(0)) print("Ns:",Ns) print("Ns:", Ntest) # print("Ns(train):",Ns) for i in range(tst_binary.size(0)): query_label, query_binary = tst_label[i], tst_binary[i] # 把测试图像编码和标签赋值给->查询图像编码和标签 _, query_result = torch.sum((query_binary != trn_binary).long(), dim=1).sort() # 判断查询图像编码是否等于训练图像编码,相等的总和,并排序。 print("查询标签-----------------------------------------------------:",query_label) print("查询二进制:", query_binary) print(len(query_binary)) print("查询结果:",query_result) print("是否相等:",query_binary != trn_binary) print("查询结果1:", torch.sum((query_binary != trn_binary).long(), dim=1)) print("查询结果2:",torch.sum((query_binary != trn_binary).long(), dim=1).sort()) correct = (query_label == trn_label[query_result]).float() # 正确匹配的二进制编码个数 print("trn_label[query_result]:",trn_label[query_result]) num_ones = torch.sum(correct == 1) print("查询正确的个数:",num_ones) print("查询正确:",correct) P = torch.cumsum(correct, dim=0) / Ns print("torch.cumsum(correct, dim=0)",torch.cumsum(correct, dim=0)) print("查询正确/Ns",torch.Tensor(P)) #每个位置的精度 P AP.append(torch.sum(P * correct) / torch.sum(correct)) # print("---:",AP) acc = num_ones / tst_binary.size(0) print("ACC================================== ", acc) mAP = torch.mean(torch.Tensor(AP)) return mAP 请问怎么将这段代码改成EER评估指标的代码

2023-07-12 上传