利用Python实现排序算法与Web交互的实验项目

前言

本篇文章将结合一次大学实验,使用Python实现排序算法的性能测试与Web交互功能,完整展示从算法实现到结果分析的过程。本实验的目标是通过编程实践,掌握基本排序算法、快速排序,以及通过Web交互方式完成输入与输出计算。

实验分为三个主要部分:

  1. 排序算法的性能比较。
  2. 查找算法效率对比。
  3. 使用Web表单实现简单交互。

实验内容与目标

实验目标
  1. 理解排序基本算法和快速排序的原理与性能差异。
  2. 掌握有序表与无序表查找的时间复杂度及性能对比。
  3. 实现一个简单的Web交互应用,模拟高性能计算的工作流程。
实验内容
  1. 排序算法测试:

    • 随机生成100个整数,使用插入排序完成排序。
    • 随机生成10万个整数,分别使用插入排序和快速排序,测试性能差异。
  2. 查找算法测试:

    • 对随机生成的100个整数,分别在无序表和有序表中查找,测试查找效率。
  3. Web交互应用:

    • 通过Web表单输入数据,调用Python代码处理排序与查找操作,并将结果返回到Web页面。

Python代码实现

1. 排序算法实现

我们需要实现插入排序和快速排序,并测试其性能。

复制代码
import random
import time

# 插入排序
def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i - 1
        while j >= 0 and arr[j] > key:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key
    return arr

# 快速排序
def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

# 性能测试
def test_sorting_algorithms():
    # 随机生成100个整数
    small_data = [random.randint(0, 1000) for _ in range(100)]
    # 随机生成10万个整数
    large_data = [random.randint(0, 100000) for _ in range(100000)]

    # 插入排序测试
    start_time = time.time()
    insertion_sort(small_data.copy())
    print(f"Insertion Sort (100 elements): {time.time() - start_time:.5f} seconds")

    start_time = time.time()
    insertion_sort(large_data.copy())
    print(f"Insertion Sort (100000 elements): {time.time() - start_time:.5f} seconds")

    # 快速排序测试
    start_time = time.time()
    quick_sort(small_data.copy())
    print(f"Quick Sort (100 elements): {time.time() - start_time:.5f} seconds")

    start_time = time.time()
    quick_sort(large_data.copy())
    print(f"Quick Sort (100000 elements): {time.time() - start_time:.5f} seconds")

test_sorting_algorithms()
2. 查找算法实现

查找算法包括在有序表和无序表中的查找效率对比。

复制代码
# 顺序查找
def sequential_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

# 二分查找
def binary_search(arr, target):
    low, high = 0, len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

# 查找测试
def test_search_algorithms():
    data = [random.randint(0, 1000) for _ in range(100)]
    data.sort()  # 二分查找需要有序表
    target = random.choice(data)

    # 无序表查找
    start_time = time.time()
    sequential_search(data, target)
    print(f"Sequential Search: {time.time() - start_time:.5f} seconds")

    # 有序表查找
    start_time = time.time()
    binary_search(data, target)
    print(f"Binary Search: {time.time() - start_time:.5f} seconds")

test_search_algorithms()
3. Web交互实现

借助Flask框架实现简单的Web交互,用于输入排序或查找参数,并返回计算结果。

复制代码
from flask import Flask, request, render_template
import random

app = Flask(__name__)

# 排序操作
@app.route('/sort', methods=['GET', 'POST'])
def sort():
    if request.method == 'POST':
        data = request.form['numbers']
        numbers = list(map(int, data.split(',')))
        sorted_numbers = quick_sort(numbers)
        return f"Sorted Numbers: {sorted_numbers}"
    return '''
        <form method="post">
            Enter numbers separated by commas: <input type="text" name="numbers"><br>
            <input type="submit" value="Sort">
        </form>
    '''

# 查找操作
@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == 'POST':
        data = request.form['numbers']
        target = int(request.form['target'])
        numbers = list(map(int, data.split(',')))
        result = sequential_search(numbers, target)
        return f"Target found at index: {result}" if result != -1 else "Target not found"
    return '''
        <form method="post">
            Enter numbers separated by commas: <input type="text" name="numbers"><br>
            Enter target number: <input type="text" name="target"><br>
            <input type="submit" value="Search">
        </form>
    '''

if __name__ == '__main__':
    app.run(debug=True)

实验结果与分析

  1. 排序算法结果:

    • 对于小规模数据(100个整数),插入排序和快速排序的性能差异不明显。
    • 对于大规模数据(10万个整数),快速排序明显快于插入排序。
    • 时间复杂度比较:
      • 插入排序:O(n²)
      • 快速排序:O(nlog₂n)
  2. 查找算法结果:

    • 在无序表中,顺序查找的效率较低,尤其是数据量较大时。
    • 在有序表中,二分查找效率显著提升,时间复杂度为O(log₂n)。
  3. Web交互结果:

    • 排序功能:用户输入一组数字,返回排序后的结果。
    • 查找功能:用户输入数字列表和目标值,返回目标值的索引或提示未找到。

总结与反思

实验收获
  1. 熟悉了Python的排序算法实现与时间复杂度分析。
  2. 理解了有序表和无序表查找的性能差异。
  3. 掌握了如何使用Flask实现简单的Web交互应用。
问题与改进
  1. 算法优化: 可以进一步实现多路归并排序,用于处理更大规模的数据。
  2. Web优化: 目前的Web页面较为简单,可改进为动态显示结果的用户界面。
  3. 大规模测试: 使用更大规模的数据(如百万级数据)测试算法性能。

参考代码与资料

通过本次实验,不仅加深了对数据结构与算法的理解,也实际体验了将算法与Web开发结合的流程。希望本文能为大家的学习提供参考!

相关推荐
在下雨59928 分钟前
项目讲解1
开发语言·数据结构·c++·算法·单例模式
Jayyih36 分钟前
嵌入式系统学习Day36(简单的网页制作)
学习·算法
脑洞代码1 小时前
20250909的学习笔记
算法
Christo31 小时前
TFS-2003《A Contribution to Convergence Theory of Fuzzy c-Means and Derivatives》
人工智能·算法·机器学习
黑菜钟1 小时前
代码随想录第七天|● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 18.四数之和
c++·算法·leetcode
Yingjun Mo1 小时前
1. 统计推断-ALMOND收敛性分析
人工智能·算法·机器学习
海梨花1 小时前
CSP认证练习题目推荐 (1)
算法·深度优先·csp
天上的光2 小时前
大模型——剪枝、量化、蒸馏、二值化
算法·机器学习·剪枝
pzx_0012 小时前
【LeetCode】14. 最长公共前缀
算法·leetcode·职场和发展
self_myth2 小时前
算法与数据结构实战技巧:从复杂度分析到数学优化
算法