作业又来了

# 排序算法

### 1.冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地比较相邻的两个元素,如果顺序不对,则交换它们。通过多次遍历数组,将最大(或最小)的元素逐渐"浮"到数组的末尾,从而实现排序。

以下是冒泡排序的基本步骤:

1. 从数组的第一个元素开始,比较它与相邻的后一个元素。
2. 如果顺序不正确,交换这两个元素的位置。
3. 继续比较下一个相邻的元素,重复上述步骤,直到遍历完整个数组。
4. 针对数组中的每个元素,依次执行上述步骤。

这样一次遍历后,最大(或最小)的元素会移动到数组的末尾。重复执行多次遍历,直到所有元素都按照顺序排列。

冒泡排序的时间复杂度为O(n^2),其中n是数组的长度。由于它的比较和交换操作比较简单,因此在小规模数据的排序中具有一定的优势,但对于大规模数据的排序效率较低。

示例代码(python):

```python
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]

# 测试示例
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("排序后的数组:", arr)

```

该示例中,数组 `[64, 34, 25, 12, 22, 11, 90]` 经过冒泡排序后,输出为 `[11, 12, 22, 25, 34, 64, 90]`。

### 2.选择排序

选择排序(Selection Sort)是一种简单的排序算法。它将待排序数组分为已排序区和未排序区,每次从未排序区中选择最小(或最大)的元素,与已排序区的最后一个元素交换位置。

以下是选择排序的基本步骤:

1. 将整个数组分为已排序区和未排序区。
2. 每次从未排序区中选择最小(或最大)的元素,记录该元素的下标。
3. 交换该元素和未排序区的第一个元素的位置,将该元素加入到已排序区中。
4. 针对数组中的每个元素,依次执行上述步骤。

通过多次遍历,每次将最小(或最大)的元素加入到已排序区的末尾,实现排序。

选择排序的时间复杂度为O(n^2),其中n是数组的长度。由于它的比较和交换操作比较简单,因此在小规模数据的排序中具有一定的优势,但对于大规模数据的排序效率较低。

示例代码(Python):

```python
def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        # 从未排序区中选择最小值的下标
        min_idx = i
        for j in range(i+1, n):
            if arr[j] < arr[min_idx]:
                min_idx = j
        
        # 将最小值移动到已排序区的末尾
        arr[i], arr[min_idx] = arr[min_idx], arr[i]

# 测试示例
arr = [64, 34, 25, 12, 22, 11, 90]
selection_sort(arr)
print("排序后的数组:", arr)

```

该示例中,数组 `[64, 34, 25, 12, 22, 11, 90]` 经过选择排序后,输出为 `[11, 12, 22, 25, 34, 64, 90]`。

### 3.插入排序

插入排序(Insertion Sort)是一种简单直观的排序算法。它将待排序数组分为已排序区和未排序区,每次从未排序区选择一个元素,插入到已排序区的正确位置。

以下是插入排序的基本步骤:

1. 将整个数组分为已排序区和未排序区。
2. 从未排序区选择第一个元素,将其插入到已排序区的合适位置。
3. 比较该元素与已排序区中的元素,找到正确的插入位置。
4. 将该元素插入到正确的位置,并将已排序区的元素后移。
5. 针对数组中的每个元素,依次执行上述步骤。

通过多次遍历,将未排序区的元素逐个插入到已排序区的合适位置,实现排序。

插入排序的时间复杂度为O(n^2),其中n是数组的长度。由于它的比较和移动操作较多,因此在小规模数据的排序中效率较高,但对于大规模数据的排序效率较低。

示例代码(Python):

```python
def insertion_sort(arr):
    n = len(arr)
    for i in range(1, n):
        key = arr[i]
        j = i - 1
        # 将比key大的元素后移
        while j >= 0 and arr[j] > key:
            arr[j+1] = arr[j]
            j -= 1
        # 插入key到正确位置
        arr[j+1] = key

# 测试示例
arr = [64, 34, 25, 12, 22, 11, 90]
insertion_sort(arr)
print("排序后的数组:", arr)

```

该示例中,数组 `[64, 34, 25, 12, 22, 11, 90]` 经过插入排序后,输出为 `[11, 12, 22, 25, 34, 64, 90]`。

# 函数

#### 函数的定义和调用函数

结构

```python
def 函数名(参数1,参数2.....):
    函数体
    return True
```

传入参数的类型检查

```python
def my_a(x):
    if not isinstance(x,(int,float)):
        raise TypeError ("i am sorry")
a = my_a(x)
print(a)
```

返回值

```python
def sum_01():
    a = 1 
    b = 2
    return a,b
a,b = sum_01()
print(a)
print(b)
```

事实上,函数返回的是一个元组,多个变量可以同时接受以个元组

# 参数

函数的参数是用于接收函数调用时传递给函数的值或对象。在函数定义时,可以定义函数的参数列表,并在函数体内使用这些参数进行相应的操作。

函数的参数可以分为以下几种类型:

1. 位置参数(Positional Arguments):也称为必需参数,按照定义时的顺序依次传入函数。调用函数时要求按照参数定义的顺序提供相应的参数值。

示例:

```python
def greet(name, age):
    print(f"Hello, {name}! You are {age} years old.")

greet("Alice", 25)

```

这里的 `name` 和 `age` 就是位置参数,函数 `greet` 在调用时需要提供这两个参数,按照位置依次传入。

2. 关键字参数(Keyword Arguments):通过指定参数名来传递参数值,可以乱序提供参数值。使用关键字参数时,不需要按照参数定义的顺序传递参数值。

示例:

```python
def greet(name, age):
    print(f"Hello, {name}! You are {age} years old.")

greet(age=25, name="Alice")

```

这里通过指定参数名 `age` 和 `name` 来传递参数值,可以不按照定义时的顺序传入参数。

3. 默认参数(Default Arguments):在函数定义时给参数指定一个默认值,如果在调用函数时没有传递该参数的值,则使用默认值。

示例:

```python
def greet(name, age=30):
    print(f"Hello, {name}! You are {age} years old.")

greet("Alice")  # 使用默认值
greet("Bob", 25)  # 不使用默认值

```

这里的 `age` 参数通过给定默认值为 `30` 成为了默认参数,在调用函数时如果不提供 `age` 的值,则使用默认值。

4. 可变参数(Variable Arguments):允许传递任意数量的参数,这些参数会被收集成一个元组或列表供函数内部使用。

示例:

```python
def sum_numbers(*args):
    total = 0
    for num in args:
        total += num
    return total

result = sum_numbers(1, 2, 3, 4, 5)
print(result)

```

这里的 `*args` 允许传递任意数量的参数,函数内部将这些参数收集成元组 `args`,可以在函数内部进行遍历和处理。

5. 关键字可变参数(Keyword Variable Arguments):允许传递任意数量的关键字参数,这些参数会被收集成一个字典供函数内部使用。

示例:

```python
def print_info(**kwargs):
    for key, value in kwargs.items():
        print(key, ":", value)

print_info(name="Alice", age=25, city="New York")

```

这里的 `**kwargs` 允许传递任意数量的关键字参数,函数内部将这些参数收集成字典 `kwargs`,可以在函数内部进行遍历和处理。

函数的参数类型可以根据具体的需求进行选择和组合,灵活使用不同类型的参数可以提高函数的适用性和可扩展性。
def guanjia(fn):
    def inner():
        print("开挂")
        fn()
        print("关闭外挂")

    return inner


@guanjia   #play_dnf = guanjia(play_dnf)
def play_dnf():
    print("你好啊,我是赛利亚,今天又是美好的一天")


@guanjia
def play_wz():
    print("来和妲己玩耍吧")


play_dnf()
play_wz()


装饰器雏形:
def wrapper(目标函数):
    def inner():
        之前添加的事情
        目标函数原函数执行
        之后添加的事情
    return inner
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值