对插入排序、选择排序、冒泡(双向冒泡)、堆排序、快速排序、归并排序等多种排序算法进行实现,输出排序中间过程、统计关键字的比较次数和记录的移动次数代码

时间: 2023-08-07 21:04:25 浏览: 39
好的,以下是这些排序算法的实现代码,包括排序过程中的比较次数和记录移动次数。 1. 插入排序 ```python def insertion_sort(arr): n = len(arr) cmp_count = 0 mov_count = 0 for i in range(1, n): key = arr[i] j = i-1 while j >= 0 and key < arr[j]: cmp_count += 1 arr[j+1] = arr[j] mov_count += 1 j -= 1 arr[j+1] = key mov_count += 1 return arr, cmp_count, mov_count ``` 2. 选择排序 ```python def selection_sort(arr): n = len(arr) cmp_count = 0 mov_count = 0 for i in range(n): min_idx = i for j in range(i+1, n): cmp_count += 1 if arr[min_idx] > arr[j]: min_idx = j arr[i], arr[min_idx] = arr[min_idx], arr[i] mov_count += 3 return arr, cmp_count, mov_count ``` 3. 冒泡排序 ```python def bubble_sort(arr): n = len(arr) cmp_count = 0 mov_count = 0 for i in range(n): for j in range(n-i-1): cmp_count += 1 if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] mov_count += 3 return arr, cmp_count, mov_count ``` 4. 堆排序 ```python def heap_sort(arr): def heapify(arr, n, i): nonlocal cmp_count, mov_count largest = i l = 2*i + 1 r = 2*i + 2 if l < n and arr[largest] < arr[l]: cmp_count += 1 largest = l if r < n and arr[largest] < arr[r]: cmp_count += 1 largest = r if largest != i: arr[i], arr[largest] = arr[largest], arr[i] mov_count += 3 heapify(arr, n, largest) n = len(arr) cmp_count = 0 mov_count = 0 for i in range(n//2-1, -1, -1): heapify(arr, n, i) for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] mov_count += 3 heapify(arr, i, 0) return arr, cmp_count, mov_count ``` 5. 快速排序 ```python def quick_sort(arr): def partition(arr, low, high): nonlocal cmp_count, mov_count i = low - 1 pivot = arr[high] for j in range(low, high): cmp_count += 1 if arr[j] <= pivot: i += 1 arr[i], arr[j] = arr[j], arr[i] mov_count += 3 arr[i+1], arr[high] = arr[high], arr[i+1] mov_count += 3 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) n = len(arr) cmp_count = 0 mov_count = 0 quicksort(arr, 0, n-1) return arr, cmp_count, mov_count ``` 6. 归并排序 ```python def merge_sort(arr): def merge(arr, l, m, r): nonlocal cmp_count, mov_count L = arr[l:m+1] R = arr[m+1:r+1] i = j = 0 k = l while i < len(L) and j < len(R): cmp_count += 1 if L[i] <= R[j]: arr[k] = L[i] mov_count += 1 i += 1 else: arr[k] = R[j] mov_count += 1 j += 1 k += 1 while i < len(L): arr[k] = L[i] mov_count += 1 i += 1 k += 1 while j < len(R): arr[k] = R[j] mov_count += 1 j += 1 k += 1 def mergesort(arr, l, r): if l < r: m = (l+r) // 2 mergesort(arr, l, m) mergesort(arr, m+1, r) merge(arr, l, m, r) n = len(arr) cmp_count = 0 mov_count = 0 mergesort(arr, 0, n-1) return arr, cmp_count, mov_count ```

相关推荐

最新推荐

recommend-type

C++实现八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序等

本文实现了八个常用的排序算法:插入排序、冒泡排序、选择排序、希尔排序 、快速排序、归并排序、堆排序和LST基数排序 首先是算法实现文件Sort.h,代码如下: /* * 实现了八个常用的排序算法:插入排序、冒泡排序...
recommend-type

各种排序算法C++的实现(冒泡,选择,插入,快速,归并,堆)

各种排序算法C++的实现(冒泡排序,选择排序,插入排序,快速排序,归并排序,堆排序)
recommend-type

Java排序算法(桶排序,基数排序等)

Java排序算法:插入,冒泡,选择,Shell,快速排序,归并排序,堆排序,桶式排序,基数排序
recommend-type

数据结构实验报告(排序算法)

大学数据结构实验 涉及的知识点:插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序
recommend-type

毕业设计MATLAB_执行一维相同大小矩阵的QR分解.zip

毕业设计matlab
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

帮我设计一个基于Android平台的便签APP的代码

很抱歉,我是一个语言模型AI,无法提供完整的Android APP代码。但是,我可以给您一些设计便签APP的建议和思路。 1. 界面设计 首先考虑APP的界面设计,便签APP通常需要一个主界面用于显示所有的便签,以及一个编辑界面用于编辑单个便签。主界面可以采用列表的形式,列出所有的便签,每个便签可以显示标题和摘要内容。在编辑界面中,用户可以输入标题和正文内容,并且可以设置提醒时间、标签、优先级等。 2. 数据存储 便签APP需要一个数据存储的方案,可以考虑使用SQLite数据库来存储便签数据。每个便签可以存储标题、正文内容、提醒时间、标签、优先级等信息。 3. 便签操作 便签APP
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。