目录
- 第一部分 基础知识
- 第2章 算法基础
- 2.1 插入排序
- 第二部分 排序和顺序统计量
- 第三部分 数据结构
- 第四部分 高级设计和分析技术
- 第五部分 高级数据结构
- 第六部分 图算法
- 第七部分 算法问题选编
- 第八部分 附录:数学基础知识
第一部分 基础知识
第2章 算法基础
2.1 插入排序
伪代码:
INSERTION-SORT(A)
1 for j = 2 to A.length
2 key = A[j]
3 // Insert A[j] into the sorted sequence A[1..j -1].
4 i = j - 1
5 while i > 0 and A[i] > key
6 A[i + 1] = A[i]
7 i = i - 1
8 A[i + 1] - key
循环不变式: 在for 循环的每次迭代的开始,包含元素A[1…j - 1]的子数组构成了当前排序号的左手中的牌,剩余的子数组A[j + 1… n]对应于仍在桌子上的牌堆。事实上,元素A[1… j - 1]就是原来在位置1 到 j - 1 的元素,但现在已按序排序。我们把A[1…j - 1]的这些性质形式地表示为一个循环不变式。
循环不变式的3条性质:
1)初始化:循环的第一次迭代之前,它为真;
2)保持:如果循环的某次迭代之前它为真,那么下次迭代之前它仍为真;
3)终止:在循环终止时,符合不变式的定义。
循环不变式可以证明插入排序的正确性。
升序排列(从低到高)实例:
#include <iostream>
// 定义一个模板函数,用于通用的比较操作
template <typename T>
void insertionSort(T arr[], int n) {
for (int j = 1; j < n; ++j) {
T key = arr[j];
int i = j - 1;
// 将大于key的元素逐步后移
while (i >= 0 && arr[i] > key) {
arr[i + 1] = arr[i];
i = i - 1;
}
arr[i + 1] = key; // 插入键值到正确位置
}
}
// 测试函数,这里假设arr是一个整数数组
int main() {
int numbers[] = {9, 5, 7, 1, 8, 6};
int size = sizeof(numbers) / sizeof(numbers[0]);
std::cout << "Original array: ";
for (int num : numbers) {
std::cout << num << " ";
}
insertionSort(numbers, size);
std::cout << "\nSorted array: ";
for (int num : numbers) {
std::cout << num << " ";
}
return 0;
}
C++在线编程网站,wandbox 运行结果:
降序排列(从高到低)实例:
#include <iostream>
template <typename T>
void insertionSort(T arr[], int n) {
for (int i = 1; i < n; ++i) {
T key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
template <typename T>
void descendingInsertionSort(T arr[], int n) {
for (int i = 1; i < n; ++i) {
T key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] < key) { // 修改这里,使用小于号 `<`
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
int main() {
int numbers[] = {5, 2, 9, 1, 7};
double doubles[] = {4.8, 1.3, 6.7, 2.1, 8.5};
insertionSort(numbers, sizeof(numbers) / sizeof(numbers[0]));
descendingInsertionSort(doubles, sizeof(doubles) / sizeof(doubles[0]));
std::cout << "Sorted integers in ascending order: ";
for (const auto& num : numbers)
std::cout << num << " ";
std::cout << "\nSorted doubles in descending order: ";
for (const auto& num : doubles)
std::cout << num << " ";
return 0;
}
C++在线编程网站,wandbox 运行结果: