利用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开发结合的流程。希望本文能为大家的学习提供参考!

相关推荐
7yewh21 分钟前
LeetCode 力扣 热题 100道(二十八)矩阵置零(C++)
c语言·数据结构·c++·算法·leetcode·矩阵
2401_8437852329 分钟前
C语言 二维数组
c语言·数据结构·算法
m0_675988232 小时前
Leetcode731. 我的日程安排表 II
python·算法·leetcode
闻缺陷则喜何志丹2 小时前
【C++动态规划】3144. 分割字符频率相等的最少子字符串|1917
c++·算法·动态规划·力扣·分割·子字符串·最少
想要AC的sjh3 小时前
【Leetcode】732. 我的日程安排表 III
c++·算法·leetcode·职场和发展
sophiaRachel3 小时前
1.1.3 插入排序
数据结构·算法·排序算法
不去幼儿园4 小时前
【强化学习】Double DQN(Double Deep Q-Network)算法
人工智能·算法·机器学习·强化学习·马尔科夫决策
今晚打老虎4 小时前
c++第13课
数据结构·c++·算法
haaaaaaarry4 小时前
快速排序排序方法演示及算法分析(附代码和实例)
算法·排序算法
慌糖4 小时前
关于数组的一些应用--------数组作函数的返回值(斐波那契数列数列的实现)
算法