常用的内部排序算法

常用的内部排序算法

简单选择排序、直接插入排序和冒泡排序、折半插入排序、希尔排序算法、快速排序算法(递归和非递归)、堆排序

运行结果:

python

输入数据15,5,6,7,8,9,10
[外链图片转存中…(img-60STknHj-1720750359076)]
[外链图片转存中…(img-QWNWapS5-1720750359078)]
[外链图片转存中…(img-fVhvkUVx-1720750359079)]

C语言

输入数据8 6 80 50 40

[外链图片转存中…(img-yKdnpElL-1720750359079)]

[外链图片转存中…(img-MlEA4ULs-1720750359080)]
[外链图片转存中…(img-D81R9SPg-1720750359080)]

代码

Python代码

import tkinter as tk
from tkinter import ttk
class SortAlgorithms:def __init__(self):self.comparisons = 0self.moves = 0def reset_counters(self):self.comparisons = 0self.moves = 0def bubble_sort(self, arr):self.reset_counters()n = len(arr)for i in range(n):for j in range(0, n - i - 1):self.comparisons += 1if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]self.moves += 1yield arr[:]def selection_sort(self, arr):self.reset_counters()n = len(arr)for i in range(n):min_idx = ifor j in range(i + 1, n):self.comparisons += 1if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]self.moves += 1yield arr[:]def insertion_sort(self, arr):self.reset_counters()for i in range(1, len(arr)):key = arr[i]j = i - 1while j >= 0 and key < arr[j]:self.comparisons += 1arr[j + 1] = arr[j]self.moves += 1j -= 1yield arr[:]arr[j + 1] = keyself.moves += 1yield arr[:]def shell_sort(self, arr):self.reset_counters()n = len(arr)gap = n // 2while gap > 0:for i in range(gap, n):temp = arr[i]j = iwhile j >= gap and arr[j - gap] > temp:self.comparisons += 1arr[j] = arr[j - gap]self.moves += 1j -= gapyield arr[:]arr[j] = tempself.moves += 1yield arr[:]gap //= 2def quick_sort(self, arr):self.reset_counters()def _quick_sort(items, low, high):if low < high:pivot_index = self.partition(items, low, high)yield from _quick_sort(items, low, pivot_index)yield from _quick_sort(items, pivot_index + 1, high)yield from _quick_sort(arr, 0, len(arr) - 1)def partition(self, items, low, high):pivot = items[(low + high) // 2]left = lowright = highwhile True:while items[left] < pivot:left += 1self.comparisons += 1while items[right] > pivot:right -= 1self.comparisons += 1if left >= right:return rightitems[left], items[right] = items[right], items[left]self.moves += 1def heap_sort(self, arr):self.reset_counters()n = len(arr)def heapify(arr, n, i):largest = il = 2 * i + 1r = 2 * i + 2if l < n and arr[largest] < arr[l]:largest = lif r < n and arr[largest] < arr[r]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]self.moves += 1heapify(arr, n, largest)for i in range(n // 2, -1, -1):heapify(arr, n, i)yield arr[:]for i in range(n - 1, 0, -1):arr[i], arr[0] = arr[0], arr[i]self.moves += 1heapify(arr, i, 0)yield arr[:]
class App:def __init__(self, root):self.root = rootself.root.title("内部排序算法模拟系统")self.sort_algorithms = SortAlgorithms()self.create_widgets()def create_widgets(self):self.frame = ttk.Frame(self.root, padding="10")self.frame.grid(row=0, column=0, sticky=(tk.W, tk.E, tk.N, tk.S))ttk.Label(self.frame, text="输入数据 (用逗号隔开)").grid(row=0, column=0, padx=5, pady=5)self.data_entry = ttk.Entry(self.frame)self.data_entry.grid(row=0, column=1, padx=5, pady=5)ttk.Label(self.frame, text="选择排序算法").grid(row=1, column=0, padx=5, pady=5)self.algorithm = ttk.Combobox(self.frame, values=["冒泡排序", "选择排序", "插入排序", "希尔排序", "快速排序", "堆排序"])self.algorithm.grid(row=1, column=1, padx=5, pady=5)self.algorithm.current(0)self.sort_btn = ttk.Button(self.frame, text="开始排序", command=self.sort_data)self.sort_btn.grid(row=2, column=0, columnspan=2, padx=5, pady=5)self.result_text = tk.Text(self.frame, height=15, width=50)self.result_text.grid(row=3, column=0, columnspan=2, padx=5, pady=5)def sort_data(self):data_str = self.data_entry.get()data = list(map(int, data_str.split(',')))algorithm = self.algorithm.get()self.result_text.delete(1.0, tk.END)self.result_text.insert(tk.END, f"原始数据: {data}\n")if algorithm == "冒泡排序":generator = self.sort_algorithms.bubble_sort(data)elif algorithm == "选择排序":generator = self.sort_algorithms.selection_sort(data)elif algorithm == "插入排序":generator = self.sort_algorithms.insertion_sort(data)elif algorithm == "希尔排序":generator = self.sort_algorithms.shell_sort(data)elif algorithm == "快速排序":generator = self.sort_algorithms.quick_sort(data)elif algorithm == "堆排序":generator = self.sort_algorithms.heap_sort(data)for sorted_data in generator:self.result_text.insert(tk.END, f"排序过程: {sorted_data}\n")comparisons = self.sort_algorithms.comparisonsmoves = self.sort_algorithms.movesself.result_text.insert(tk.END, f"\n排序结果: {data}\n")self.result_text.insert(tk.END, f"比较次数: {comparisons}\n")self.result_text.insert(tk.END, f"移动次数: {moves}\n")
if __name__ == "__main__":root = tk.Tk()app = App(root)
root.mainloop()

C语言代码

#include <stdio.h>
#include <stdlib.h>
int comparisons = 0;
int moves = 0;
void reset_counters() {comparisons = 0;moves = 0;
}
void print_array(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("\n");
}
void bubble_sort(int arr[], int size) {reset_counters();for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {comparisons++;if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;moves++;print_array(arr, size);}}}
}
void selection_sort(int arr[], int size) {reset_counters();for (int i = 0; i < size - 1; i++) {int min_idx = i;for (int j = i + 1; j < size; j++) {comparisons++;if (arr[j] < arr[min_idx]) {min_idx = j;}}int temp = arr[min_idx];arr[min_idx] = arr[i];arr[i] = temp;moves++;print_array(arr, size);}
}
void insertion_sort(int arr[], int size) {reset_counters();for (int i = 1; i < size; i++) {int key = arr[i];int j = i - 1;while (j >= 0 && arr[j] > key) {comparisons++;arr[j + 1] = arr[j];moves++;j--;print_array(arr, size);}arr[j + 1] = key;moves++;print_array(arr, size);}
}
void shell_sort(int arr[], int size) {reset_counters();for (int gap = size / 2; gap > 0; gap /= 2) {for (int i = gap; i < size; i++) {int temp = arr[i];int j;for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {comparisons++;arr[j] = arr[j - gap];moves++;print_array(arr, size);}arr[j] = temp;moves++;print_array(arr, size);}}
}
void quick_sort(int arr[], int left, int right) {if (left < right) {int i = left, j = right, pivot = arr[left];while (i < j) {while (i < j && arr[j] >= pivot) {comparisons++;j--;}if (i < j) {arr[i++] = arr[j];moves++;print_array(arr, right - left + 1);}while (i < j && arr[i] <= pivot) {comparisons++;i++;}if (i < j) {arr[j--] = arr[i];moves++;print_array(arr, right - left + 1);}}arr[i] = pivot;moves++;print_array(arr, right - left + 1);quick_sort(arr, left, i - 1);quick_sort(arr, i + 1, right);}
}
void heapify(int arr[], int size, int i) {int largest = i; int l = 2 * i + 1; int r = 2 * i + 2;if (l < size && arr[l] > arr[largest]) {comparisons++;largest = l;}if (r < size && arr[r] > arr[largest]) {comparisons++;largest = r;}if (largest != i) {int temp = arr[i];arr[i] = arr[largest];arr[largest] = temp;moves++;print_array(arr, size);heapify(arr, size, largest);}
}
void heap_sort(int arr[], int size) {reset_counters();for (int i = size / 2 - 1; i >= 0; i--) {heapify(arr, size, i);}for (int i = size - 1; i > 0; i--) {int temp = arr[0];arr[0] = arr[i];arr[i] = temp;moves++;print_array(arr, size);heapify(arr, i, 0);}
}
int main() {int choice, size;printf("请输入要排序的数组大小: ");scanf("%d", &size);int arr[size];printf("请输入数组元素 (用空格隔开): ");for (int i = 0; i < size; i++) {scanf("%d", &arr[i]);}printf("请选择排序算法:\n");printf("1. 冒泡排序\n");printf("2. 选择排序\n");printf("3. 插入排序\n");printf("4. 希尔排序\n");printf("5. 快速排序\n");printf("6. 堆排序\n");printf("请输入选择 (1-6): ");scanf("%d", &choice);switch (choice) {case 1:printf("冒泡排序:\n");bubble_sort(arr, size);break;case 2:printf("选择排序:\n");selection_sort(arr, size);break;case 3:printf("插入排序:\n");insertion_sort(arr, size);break;case 4:printf("希尔排序:\n");shell_sort(arr, size);break;case 5:printf("快速排序:\n");quick_sort(arr, 0, size - 1);break;case 6:printf("堆排序:\n");heap_sort(arr, size);break;default:printf("无效选择!\n");return 1;}printf("\n排序结果: ");print_array(arr, size);printf("比较次数: %d\n", comparisons);printf("移动次数: %d\n", moves);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】二维数组

文章目录 一、什么是二维数组二、二维数组的声明形式三、二维数组的创建(1)静态初始化(2)动态初始化 四、二维数组的输入五、二维数组在内存中的存储方式 一、什么是二维数组 一维数组的声明是int[] arr&#xff0c;int[] arr {0,1,2,3,…};通过一维数组的形式和表达式 我们…

使用Nginx实现高效负载均衡

概述 Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;广泛用于Web服务的负载均衡。它能有效分发流量至多个后端服务器&#xff0c;提高网站的可用性和响应速度&#xff0c;同时增强系统的可扩展性和安全性。本文将介绍如何配置Nginx进行负载均衡&#xff0c;并提供具体的…

FPGA设计中的流水线 -分割大的计算电路可以更快的处理数据。

FPGA&#xff08;现场可编程门阵列&#xff09;设计中的流水线优化是一种提高设计性能的技术&#xff0c;它通过将设计分解为多个阶段或步骤来实现。每个阶段可以并行执行&#xff0c;从而提高整体的吞吐量和效率。以下是流水线优化的一些关键概念和作用&#xff1a; 意思&…

window下tqdm进度条

原代码是linux下运行&#xff0c;修改后可在window下运行。 #ifndef TQDM_H #define TQDM_H#include <chrono> #include <ctime> #include <numeric> #include <ios> #include <string> #include <cstdlib> #include <iostream> #i…

CollectionUtils的使用

1、非空判断 判断集合是否为空 List<String>对象list&#xff0c;可以使用CollectionUtils中的isEmpty方法来判断list是否为空。代码如下 List<String> list new ArrayList<>(); boolean isEmpty CollectionUtils.isEmpty(list); System.out.println(is…

numpy实现sigmoid函数

numpy实现sigmoid函数 在Python中&#xff0c;可以使用NumPy库的numpy.exp函数来计算e的指数&#xff0c;然后通过除法将其映射到0和1之间&#xff0c;实现sigmoid函数。以下是实现sigmoid函数的示例代码&#xff1a; import numpy as npdef sigmoid(x):return 1 / (1 np.ex…

WordPress 主题技巧:给文章页增加“谁来过”模块。

模块功能&#xff1a; 我个人目前在做一个电影类的网站&#xff0c;在开发文章页的模版时候&#xff0c;突然觉得给文章页增加一个“谁对本电影感兴趣”的功能模块可能会比较有趣&#xff0c;这个功能有点类似于‘足迹’的感觉&#xff0c;用户可以通过这个功能&#xff0c;发…

Log4j的原理及应用详解(三)

本系列文章简介&#xff1a; 在软件开发的广阔领域中&#xff0c;日志记录是一项至关重要的活动。它不仅帮助开发者追踪程序的执行流程&#xff0c;还在问题排查、性能监控以及用户行为分析等方面发挥着不可替代的作用。随着软件系统的日益复杂&#xff0c;对日志管理的需求也日…

前端的页面代码

根据老师教的前端页面的知识&#xff0c;加上我也是借鉴了老师上课所说的代码&#xff0c;马马虎虎的写出了页面。如下代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</ti…

k8s 部署 metribeat 实现 kibana 可视化 es 多集群监控指标

文章目录 [toc]环境介绍老(来)板(把)真(展)帅(示)helm 包准备配置监控集群获取集群 uuid生成 api_key配置 values.yaml 配置 es 集群获取集群 uuid 和 api_key配置 values.yaml 查看监控 缺少角色的报错 开始之前&#xff0c;需要准备好以下场景 一套 k8s 环境 k8s 内有两套不同…

PostgreSQL 导入 .gz 备份文件

要在PostgreSQL中导入.gz压缩的备份文件&#xff0c;你需要先解压缩该文件&#xff0c;然后使用psql工具导入。以下是步骤和示例代码&#xff1a; 解压缩备份文件&#xff1a; gunzip your_backup_file.gz 确保你有足够的权限来导入数据库。 使用psql导入解压后的文件&…

电脑如何重新分盘——保姆级教程

方法一&#xff1a; 通过此电脑&#xff0c;鼠标右键点击此电脑&#xff0c;点击管理 点击磁盘管理进入 二&#xff0c;磁盘分区 我这里选择的是“磁盘0”的C盘进行操作&#xff0c;一般新电脑拿到手的时候都处于这么一个状态&#xff0c;只有一个磁盘分区。现在我要把C盘拆分…

怎么知道服务器100M带宽可以支持多少人访问?

服务器100M带宽能够支持多少人访问取决于多种因素&#xff0c;包括但不限于网页大小、用户行为、数据传输类型以及预期的使用模式。以下是一些评估100M带宽可以支持多少人访问的考虑因素&#xff1a; 1. 网页大小&#xff1a; - 假设平均网页大小为1MB(虽然实际情况可能更小或更…

从汇编层看64位程序运行——参数传递的底层实现

大纲 小于等于6个参数一个参数总结 两个参数总结 三个参数总结 四个参数总结 五个参数总结 六个参数总结 大于6个参数七个参数总结 在32位系统中&#xff0c;参数的传递主要依靠栈来进行。那么64位系统上&#xff0c;是否依旧符合这个规则呢&#xff1f;答案是“不是”。64位系…

Redis6.2.1版本集群新加副本

测试数据 通过redis-benchmark生成测试数据 ./bin/redis-benchmark -h 172.31.4.18 -p 6381 -a Redis_6.2.1_Sc --cluster -t set -d 128 -n 10000000 -r 100000000 -c 200新加节点 172.31.4.18:6381> AUTH Redis_6.2.1_Sc OK172.31.4.18:6381> cluster meet 172.31.4…

Vue 组件之间的通信方式

Vue 组件之间的通信方式有多种&#xff0c;可以根据具体场景和需求选择合适的方式&#xff1a; Props / Events&#xff1a; 父组件通过 props 向子组件传递数据&#xff0c;子组件通过事件&#xff08;$emit&#xff09;向父组件发送消息。 适用于父子组件之间…

FFmpeg开发环境搭建

FFmpeg是音视频开发必备的库&#xff0c;也是唯一的库。本文主要讲解在ubuntu22和macOS14环境下的编译安装。 为什么要自己编译呢&#xff1f;其中一个很重要的原因就是ffmpeg在编译时可以加入很多插件&#xff0c;这种特定的库网络上可能找不到编译好的版本&#xff0c;另外如…

uniapp引入 uview( HBuilder 和 npm 两种安装方式) #按需引入

方式一、HBuilder 安装 uview 1.1. HBuider安装-链接-》》 1.2. 在uni.scss 中引入 import "uni_modules/uview-ui/theme.scss";1.3. main.js 引入&#xff08;import Vue from ‘vue’ 下面&#xff09; import uView from "uni_modules/uview-ui"; V…

在自定义总线下注册设备

1、自定义总线下注册设备 //my_bus_dev.c #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/kobject.h> #include<linux/slab.h> #include<linux/sysfs.h> #include<linux/device.h> #in…

solidity实战练习3——荷兰拍卖

//SPDX-License-Identifier:MIT pragma solidity ^0.8.24; interface IERC721{function transFrom(address _from,address _to,uint nftid) external ; }contract DutchAuction { address payable immutable seller;//卖方uint immutable startTime;//拍卖开始时间uint immut…