Homework3
1.编写 Python程序,判断输入a是否为质数
In [2]:
Copied!
def is_primer(num):
if num == 2:
print("a primer")
return
for i in range(2,int(num**0.5)+2):
if num % i == 0:
print("not a primer")
return
print("a primer")
num = int(input("输入整数:"))
is_primer(num)
def is_primer(num):
if num == 2:
print("a primer")
return
for i in range(2,int(num**0.5)+2):
if num % i == 0:
print("not a primer")
return
print("a primer")
num = int(input("输入整数:"))
is_primer(num)
a primer 输入整数:33 not a primer
2.用Python实现插入排序该算法,不允许直接调用插入排序函数,需要手动实现其逻辑过程。
In [3]:
Copied!
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
# 测试
arr = [12, 11, 13, 5, 6]
sorted_arr = insertion_sort(arr)
print("Sorted array:", sorted_arr)
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
# 测试
arr = [12, 11, 13, 5, 6]
sorted_arr = insertion_sort(arr)
print("Sorted array:", sorted_arr)
Sorted array: [5, 6, 11, 12, 13]
3.用Python实现选择排序该算法,不允许直接调用选择排序函数,需要手动实现其逻辑过程。
In [4]:
Copied!
def selection_sort(arr):
for i in range(len(arr)):
min_index = i
# 查找数组中剩余元素的最小值
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
# 将找到的最小值和当前元素交换
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
arr = [64, 25, 12, 22, 11]
sorted_arr = selection_sort(arr)
print("Sorted array:", sorted_arr)
def selection_sort(arr):
for i in range(len(arr)):
min_index = i
# 查找数组中剩余元素的最小值
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
# 将找到的最小值和当前元素交换
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
arr = [64, 25, 12, 22, 11]
sorted_arr = selection_sort(arr)
print("Sorted array:", sorted_arr)
Sorted array: [11, 12, 22, 25, 64]
4.用Python实现快速排序该算法,不允许直接调用快速排序函数,需要手动实现其逻辑过程。
In [5]:
Copied!
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
# 划分数组,分成小于基准值和大于等于基准值的两部分
left = [x for x in arr[1:] if x < pivot]
right = [x for x in arr[1:] if x >= pivot]
# 递归排序左半部分和右半部分,并合并
return quick_sort(left) + [pivot] + quick_sort(right)
arr = [1, 10, 7, 8, 9, 1, 5]
sorted_arr = quick_sort(arr)
print("Sorted array:", sorted_arr)
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[0]
# 划分数组,分成小于基准值和大于等于基准值的两部分
left = [x for x in arr[1:] if x < pivot]
right = [x for x in arr[1:] if x >= pivot]
# 递归排序左半部分和右半部分,并合并
return quick_sort(left) + [pivot] + quick_sort(right)
arr = [1, 10, 7, 8, 9, 1, 5]
sorted_arr = quick_sort(arr)
print("Sorted array:", sorted_arr)
Sorted array: [1, 1, 5, 7, 8, 9, 10]
5.使用 Python 随机生成三组长度递增的随机数列,长度分别为100、1000、10000,对生成的随机数组使用不同的排序算法,例如选择排序和归并排序,至少三种排序方法。对这些数列的数据排序,并分析不同排序算法在不同长度数列下的运行效果,例如运行时间等指标。(可以使用排序函数)
In [6]:
Copied!
import numpy as np
import time
array_100 = np.random.randint(0, 10000, size=100)
array_1000 = np.random.randint(0, 10000, size=1000)
array_10000 = np.random.randint(0, 10000, size=10000)
# 定义一个计时器装饰器,用于计算函数执行时间
def timer(func):
def wrapper(arr):
start_time = time.time()
result = func(arr)
end_time = time.time()
return result, end_time - start_time
return wrapper
@timer
def selection_sort(arr):
arr = arr.copy() # 复制数组以防止修改原数组
for i in range(len(arr)):
min_index = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
@timer
def merge_sort(arr):
if len(arr) <= 1:
return arr.copy()
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
mid = len(arr) // 2
left = merge_sort(arr[:mid])[0]
right = merge_sort(arr[mid:])[0]
return merge(left, right)
@timer
def quick_sort(arr):
if len(arr) <= 1:
return arr.copy()
pivot = arr[0]
left = [x for x in arr[1:] if x < pivot]
right = [x for x in arr[1:] if x >= pivot]
return quick_sort(left)[0] + [pivot] + quick_sort(right)[0]
results = []
for arr, length in [(array_100, 100), (array_1000, 1000), (array_10000, 10000)]:
_, time_selection = selection_sort(arr)
_, time_merge = merge_sort(arr)
_, time_quick = quick_sort(arr)
results.append({
"Array Length": length,
"Selection Sort Time (s)": time_selection,
"Merge Sort Time (s)": time_merge,
"Quick Sort Time (s)": time_quick
})
for result in results:
print(f"Array Length: {result['Array Length']}")
print(f"Selection Sort Time: {result['Selection Sort Time (s)']:.6f} seconds")
print(f"Merge Sort Time: {result['Merge Sort Time (s)']:.6f} seconds")
print(f"Quick Sort Time: {result['Quick Sort Time (s)']:.6f} seconds")
print("-" * 50)
import numpy as np
import time
array_100 = np.random.randint(0, 10000, size=100)
array_1000 = np.random.randint(0, 10000, size=1000)
array_10000 = np.random.randint(0, 10000, size=10000)
# 定义一个计时器装饰器,用于计算函数执行时间
def timer(func):
def wrapper(arr):
start_time = time.time()
result = func(arr)
end_time = time.time()
return result, end_time - start_time
return wrapper
@timer
def selection_sort(arr):
arr = arr.copy() # 复制数组以防止修改原数组
for i in range(len(arr)):
min_index = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_index]:
min_index = j
arr[i], arr[min_index] = arr[min_index], arr[i]
return arr
@timer
def merge_sort(arr):
if len(arr) <= 1:
return arr.copy()
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
mid = len(arr) // 2
left = merge_sort(arr[:mid])[0]
right = merge_sort(arr[mid:])[0]
return merge(left, right)
@timer
def quick_sort(arr):
if len(arr) <= 1:
return arr.copy()
pivot = arr[0]
left = [x for x in arr[1:] if x < pivot]
right = [x for x in arr[1:] if x >= pivot]
return quick_sort(left)[0] + [pivot] + quick_sort(right)[0]
results = []
for arr, length in [(array_100, 100), (array_1000, 1000), (array_10000, 10000)]:
_, time_selection = selection_sort(arr)
_, time_merge = merge_sort(arr)
_, time_quick = quick_sort(arr)
results.append({
"Array Length": length,
"Selection Sort Time (s)": time_selection,
"Merge Sort Time (s)": time_merge,
"Quick Sort Time (s)": time_quick
})
for result in results:
print(f"Array Length: {result['Array Length']}")
print(f"Selection Sort Time: {result['Selection Sort Time (s)']:.6f} seconds")
print(f"Merge Sort Time: {result['Merge Sort Time (s)']:.6f} seconds")
print(f"Quick Sort Time: {result['Quick Sort Time (s)']:.6f} seconds")
print("-" * 50)
Array Length: 100 Selection Sort Time: 0.000973 seconds Merge Sort Time: 0.000000 seconds Quick Sort Time: 0.000000 seconds -------------------------------------------------- Array Length: 1000 Selection Sort Time: 0.054685 seconds Merge Sort Time: 0.004884 seconds Quick Sort Time: 0.000975 seconds -------------------------------------------------- Array Length: 10000 Selection Sort Time: 4.982640 seconds Merge Sort Time: 0.049804 seconds Quick Sort Time: 0.021482 seconds --------------------------------------------------
6.使用python代码获取当前系统时间
In [7]:
Copied!
import datetime
print(datetime.datetime.now())
import datetime
print(datetime.datetime.now())
2024-10-16 16:04:01.711569
7.Homework/data文件夹下的stuGrade.csv文件中包含5位同学的学号、语文成绩、数学成绩和英语成绩,请先用记事本打开该文件,查看文件内容,然后编写Python程序,读取该文件,并计算出各科的平均成绩(保留2位小数)。
In [8]:
Copied!
import pandas as pd
df = pd.read_csv('data/stuGrade.csv')
average_chinese = round(df['chinese'].mean(), 2)
average_math = round(df['math'].mean(), 2)
average_english = round(df['english'].mean(), 2)
print(f"语文平均成绩: {average_chinese}")
print(f"数学平均成绩: {average_math}")
print(f"英语平均成绩: {average_english}")
import pandas as pd
df = pd.read_csv('data/stuGrade.csv')
average_chinese = round(df['chinese'].mean(), 2)
average_math = round(df['math'].mean(), 2)
average_english = round(df['english'].mean(), 2)
print(f"语文平均成绩: {average_chinese}")
print(f"数学平均成绩: {average_math}")
print(f"英语平均成绩: {average_english}")
语文平均成绩: 82.6 数学平均成绩: 81.0 英语平均成绩: 81.8
8.请在第7题的代码继续编写Python程序,将以下内容写入my.txt文件中,一并上传到github中。
第1行:你的学号和姓名
第2行:3门课程的平均成绩(任意课程),保留2位小数,以英文逗号间隔
第3行:系统当前时间,格式例如2020-01-01 12:00:00
第4行:两秒后的系统当前时间(利用sleep()方法)
In [13]:
Copied!
import time
from datetime import datetime
student_id = "10211900416"
student_name = "郭夏辉"
# 获取当前时间
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
time.sleep(2)
time1 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
content = [
f"{student_id} {student_name}",
f"{average_chinese},{average_math},{average_english}",
current_time,
time1
]
with open('data/my.txt', 'w',encoding='utf-8') as file:
file.write("\n".join(content))
with open('data/my.txt', 'r', encoding='utf-8') as file:
print(file.read())
import time
from datetime import datetime
student_id = "10211900416"
student_name = "郭夏辉"
# 获取当前时间
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
time.sleep(2)
time1 = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
content = [
f"{student_id} {student_name}",
f"{average_chinese},{average_math},{average_english}",
current_time,
time1
]
with open('data/my.txt', 'w',encoding='utf-8') as file:
file.write("\n".join(content))
with open('data/my.txt', 'r', encoding='utf-8') as file:
print(file.read())
10211900416 郭夏辉 82.6,81.0,81.8 2024-10-16 16:20:08 2024-10-16 16:20:10