十大排序算法是计算机科学领域中常用的排序算法，根据其时间复杂度和实现方式大致可分为比较类排序和非比较类排序，以下为你详细介绍：

### 比较类排序
这类排序算法通过比较元素间的大小关系来确定元素的最终位置。
1. **冒泡排序（Bubble Sort）**
    - **原理**：重复遍历要排序的数列，一次比较两个元素，如果它们的顺序错误就把它们交换过来，直到整个数列都被排序好，就像气泡从水底逐渐升到水面一样。
    - **时间复杂度**：$O(n^2)$ 
    - **空间复杂度**：$O(1)$
    - **稳定性**：稳定 
    - **适用场景**：数据量较小且基本有序的情况。
2. **选择排序（Selection Sort）**
    - **原理**：在未排序序列中找到最小（大）元素，存放到排序序列的起始位置，然后，再从剩余未排序元素中继续寻找最小（大）元素，然后放到已排序序列的末尾，以此类推，直到所有元素均排序完毕。
    - **时间复杂度**：$O(n^2)$ 
    - **空间复杂度**：$O(1)$
    - **稳定性**：不稳定
    - **适用场景**：数据量较小且对稳定性要求不高的情况。
3. **插入排序（Insertion Sort）**
    - **原理**：将未排序数据插入到已排序序列的合适位置，就像玩扑克牌时整理手牌一样。
    - **时间复杂度**：$O(n^2)$ 
    - **空间复杂度**：$O(1)$
    - **稳定性**：稳定
    - **适用场景**：数据量较小且基本有序的情况。
4. **希尔排序（Shell Sort）**
    - **原理**：它是插入排序的一种改进版本，也称为缩小增量排序。通过将原始数据分成多个子序列来改善插入排序的性能，先比较距离较远的元素，而不是像插入排序那样比较相邻元素。
    - **时间复杂度**：与增量序列的选择有关，平均约为 $O(n^{1.3})$ 
    - **空间复杂度**：$O(1)$
    - **稳定性**：不稳定
    - **适用场景**：中等规模的数据排序。
5. **归并排序（Merge Sort）**
    - **原理**：采用分治法，将一个数组分成两个子数组，分别对这两个子数组进行排序，然后将排好序的子数组合并成一个最终的有序数组。
    - **时间复杂度**：$O(n log n)$ 
    - **空间复杂度**：$O(n)$
    - **稳定性**：稳定
    - **适用场景**：数据量大且对稳定性有要求的情况。
6. **快速排序（Quick Sort）**
    - **原理**：同样采用分治法，选择一个基准值，将数组分为两部分，使得左边部分的元素都小于等于基准值，右边部分的元素都大于等于基准值，然后递归地对左右两部分进行排序。
    - **时间复杂度**：平均 $O(n log n)$，最坏 $O(n^2)$ 
    - **空间复杂度**：平均 $O(log n)$，最坏 $O(n)$
    - **稳定性**：不稳定
    - **适用场景**：数据量大且分布较为随机的情况。
7. **堆排序（Heap Sort）**
    - **原理**：利用堆这种数据结构，通常是最大堆（每个节点的值都大于或等于其子节点的值）或最小堆，将待排序序列构造成一个堆，然后依次取出堆顶元素，调整堆结构，直到整个序列有序。
    - **时间复杂度**：$O(n log n)$ 
    - **空间复杂度**：$O(1)$
    - **稳定性**：不稳定
    - **适用场景**：数据量大且对空间复杂度有要求的情况。

### 非比较类排序
这类排序算法不通过比较元素间的大小关系来确定元素的最终位置。
8. **计数排序（Counting Sort）**
    - **原理**：通过统计每个元素出现的次数，然后根据统计结果将元素依次输出。它要求输入的数据必须是有确定范围的整数。
    - **时间复杂度**：$O(n + k)$，其中 $k$ 是数据范围。 
    - **空间复杂度**：$O(k)$
    - **稳定性**：稳定
    - **适用场景**：数据范围较小且数据值为整数的情况。
9. **桶排序（Bucket Sort）**
    - **原理**：将数据分到有限数量的桶里，每个桶再分别进行排序（可以使用其他排序算法），最后将各个桶中的数据合并成一个有序序列。
    - **时间复杂度**：平均 $O(n + k)$，其中 $k$ 是桶的数量。 
    - **空间复杂度**：$O(n + k)$
    - **稳定性**：取决于桶内排序算法
    - **适用场景**：数据均匀分布在某个范围内的情况。
10. **基数排序（Radix Sort）**
    - **原理**：按照低位先排序，然后收集；再按照高位排序，然后再收集；依次类推，直到最高位。
    - **时间复杂度**：$O(d(n + k))$，其中 $d$ 是最大数字的位数，$k$ 是基数（如十进制中 $k = 10$）。 
    - **空间复杂度**：$O(n + k)$
    - **稳定性**：稳定
    - **适用场景**：数据位数固定且范围较大的整数排序。 