STL中的排序算法原理及应用
发布时间: 2023-12-20 21:38:45 阅读量: 45 订阅数: 48
STL中的排序算法一览
# 1. 介绍STL和排序算法概述
## 1.1 STL(标准模板库)简介
STL(Standard Template Library,标准模板库)是C++语言的标准库之一,提供了一系列通用的模板类和函数,包括算法、容器、迭代器等,为C++程序员提供了丰富的工具和功能。
STL包括了多个组件,其中最重要的组件之一就是排序算法。排序算法是STL中最常用的功能之一,它能够对容器中的元素进行排序操作。
## 1.2 排序算法的基本概念
排序算法是将一组数据按照特定的顺序进行排列的算法。常见的排序算法包括插入排序、交换排序、选择排序和归并排序等。
排序算法的性能通常通过时间复杂度和空间复杂度来衡量,不同的排序算法在不同的场景中会有不同的性能表现。
## 1.3 STL中排序算法的分类和特点
STL中的排序算法包括了多种不同的算法实现,它们在不同的场景中有着各自的优势和适用性。STL中的排序算法主要可以分为以下几类:
1. 插入排序算法
2. 交换排序算法
3. 选择排序算法
4. 归并排序算法
每种类型的排序算法在STL中都有对应的实现,程序员可以根据实际的需求选择合适的排序算法来进行使用。
# 2. 插入排序算法
插入排序算法是一种简单直观的排序算法。它的基本思想是将一个元素插入到已排序序列的合适位置,使得插入后的序列仍然有序。插入排序算法在实现上比较简单,并且在小规模数据的排序中具有较好的性能。
### 2.1 直接插入排序原理及实现
直接插入排序是插入排序的一种基本形式,它的思想是将一个元素插入到已排序序列的合适位置。具体的实现过程如下:
1. 将待排序序列的第一个元素视为已排序序列,将剩余的元素视为未排序序列。
2. 从未排序序列中取出第一个元素,依次与已排序序列中的元素比较,找到合适的位置将其插入。
3. 重复步骤2,直到未排序序列为空。
以下是直接插入排序的Java代码实现:
```java
public class InsertionSort {
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; ++i) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j = j - 1;
}
arr[j + 1] = key;
}
}
public static void main(String[] args) {
int[] arr = {5, 3, 8, 2, 1, 4};
System.out.println("Before sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
insertionSort(arr);
System.out.println("\nAfter sorting:");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
```
**代码说明:**
- `insertionSort` 函数实现了直接插入排序算法,参数 `arr` 是待排序的数组。
- 首先,获取数组的长度,并从第二个元素开始进行遍历。将当前元素 `arr[i]` 存储在 `key` 变量中,并将 `j` 初始化为 `i-1`。
- 在内部循环中,将大于 `key` 的元素向后移动一位,直到找到小于等于 `key` 的位置。将 `key` 插入到合适的位置。
- 在主函数中,创建一个待排序的数组 `arr`,并输出排序前的元素。然后调用 `insertionSort` 函数进行排序,并输出排序后的元素。
**代码执行结果:**
```
Before sorting:
5 3 8 2 1 4
After sorting:
1 2 3 4 5 8
```
### 2.2 二分插入排序原理及实现
二分插入排序是对直接插入排序的优化,它的思想是通过二分查找的方式找到插入位置,从而减少比较的次数。它比直接插入排序的效率稍高,但实现过程稍复杂。
具体实现过程如下:
1. 将待排序序列的第一个元素视为已排序序列,将剩余的元素视为未排序序列。
2. 从未排序序列中取出第一个元素,使用二分查找找到合适的位置将其插入。
3. 重复步骤2,直到未排序序列为空。
以下是二分插入排序的Python代码实现:
```python
def binaryInsertionSort(arr):
for i in range(1, len(arr)):
key = arr[i]
left = 0
right = i - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] > key:
right = mid - 1
else:
left = mid + 1
for j in range(i - 1, left - 1, -1):
arr[j + 1] = arr[j]
arr[left] = key
arr = [5, 3, 8, 2, 1, 4]
print("Before sorting:", arr)
binaryInsertionSort(arr)
print("After sorting:", arr)
```
**代码说明:**
- `binaryInsertionSort` 函数实现了二分插入排序算法,参数 `arr` 是待排序的数组。
- 首先,遍历数组,从第二个元素开始,将当前元素 `arr[i]` 存储在 `key` 变量中,并使用二分查找找到 `key` 的插入位置。
- 在插入位置之后的元素依次向后移动一位,为 `key` 腾出位置。
- 在主函数中,创建一个待排序的数组 `arr`,并输出排序前的元素。然后调用 `binaryInsertionSort` 函数进行排序,并输出排序后的元素。
**代码执行结果:**
```
Before sorting: [5, 3, 8, 2, 1, 4]
After sorting: [1, 2, 3, 4, 5, 8]
```
### 2.3 希尔排序原理及实现
希尔排序是插入排序的一种改进算法,它通过将待排序序列分割成若干个较小的子序列进行插入排序,最后再对整个序列进行一次插入排序。希尔排序的核心思想是通过将较大的元素尽快地移动到序列的两端,提高排序的效率。
具体实现过程如下:
1. 首先,选择一个增量序列,将待排序序列分割成若干个较小的子序列。
2. 对每个子序列进行插入排序。
3. 缩小增量,重复步骤2,直到增量为1。
以下是希尔排序的Go代码实现:
```go
package main
import "fmt"
func shellSort(arr []int) {
n := len(arr)
gap := 1
for gap < n/3 {
gap = gap*3 + 1
}
for gap > 0 {
for i := gap; i < n; i++ {
temp := arr[i]
j := i - gap
for j >= 0 && arr[j] > temp {
arr[j+gap] = arr[j]
j -= gap
}
arr[j+gap] = temp
}
gap /= 3
}
}
func main() {
arr := []int{5, 3, 8, 2, 1, 4}
fmt.Println("Before sorting:", arr)
shellSort(arr)
fmt.Println("After sorting:", a
```
0
0