第4关:数据排序

enter_number = int(input('输入数据个数:'))
middle_list = []
complete_list = []
for number in range(enter_number):
    digital = int(input('输入一个数:'))
    middle_list.append(digital)
    #将输入的数字加入中间列表
while middle_list:
    min_data = min(middle_list)
    #将中间列表中最小的数字依次加入完成列表
    location_min_data = middle_list.index(min_data)
    complete_list.append(min_data)
    del middle_list[location_min_data]      
print(f'排序后数据: {complete_list}')  

本关任务:编写程序,不使用Python内置函数sort,编程实现将n个数按从小到大顺序排列后输出。
测试输入:
输入数据个数:3
输入一个数:12
输入一个数:78
输入一个数:54
预期输出:
排序后数据: [12, 54, 78]
测试输入:
输入数据个数:5
输入一个数:123
输入一个数:5
输入一个数:78
输入一个数:-1
输入一个数:9
预期输出:
排序后数据: [-1, 5, 9, 78, 123]

### 堆排序算法的实现与应用 堆排序是一种基于堆数据结构的比较排序算法,其时间复杂度为 \(O(n \log n)\),适用于大规模数据排序场景。以下是堆排序的详细实现和应用场景。 #### 1. 堆排序的基本原理 堆排序利用了二叉堆(Binary Heap)的性质,其中二叉堆分为最大堆和最小堆两种形式。在最大堆中,父节点的值总是大于或等于子节点的值;而在最小堆中,父节点的值总是小于或等于子节点的值[^1]。堆排序的过程可以分为两个主要阶段:建堆和调整堆。 #### 2. 堆排序实现 以下是使用 Java 实现排序的完整代码示例: ```java public class HeapSort { public void sort(int arr[]) { int n = arr.length; // 建堆过程:从最后一个非叶子节点开始调整堆 for (int i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i); } // 调整堆过程:逐步将堆顶元素移至数组末尾,并重新调整堆 for (int i = n - 1; i > 0; i--) { // 将当前堆顶元素与最后一个元素交换 int temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; // 调整剩余堆的结构 heapify(arr, i, 0); } } // 调整堆的函数 void heapify(int arr[], int n, int i) { int largest = i; // 初始化最大值为根节点 int left = 2 * i + 1; // 左子节点 int right = 2 * i + 2; // 右子节点 // 如果左子节点大于根节点,则更新最大值 if (left < n && arr[left] > arr[largest]) { largest = left; } // 如果右子节点大于当前最大值,则更新最大值 if (right < n && arr[right] > arr[largest]) { largest = right; } // 如果最大值是根节点,则交换并递归调整堆 if (largest != i) { int swap = arr[i]; arr[i] = arr[largest]; arr[largest] = swap; heapify(arr, n, largest); } } // 打印数组 static void printArray(int arr[]) { for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); } public static void main(String args[]) { int arr[] = {12, 11, 13, 5, 6, 7}; HeapSort hs = new HeapSort(); hs.sort(arr); System.out.println("Sorted array is:"); printArray(arr); } } ``` #### 3. 堆排序的应用场景 堆排序在以下场景中具有广泛的应用: - **内存受限的排序**:由于堆排序的空间复杂度为 \(O(1)\),它非常适合用于内存受限的环境[^2]。 - **优先队列**:堆排序的核心思想可以用于实现优先队列,例如任务调度系统中的任务优先级管理[^4]。 - **部分排序**:如果只需要获取数据集中前 \(k\) 大或前 \(k\) 小的元素,堆排序可以高效完成这一任务[^3]。 #### 4. 性能分析 堆排序的时间复杂度为 \(O(n \log n)\),空间复杂度为 \(O(1)\)。尽管堆排序的性能优异,但它是一个稳定的排序算法,因此在需要保持排序稳定性的情况下适合使用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-阿呆-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值