本章主要是算法知识的基础讲解,介绍了循环不变式,几个简单的排序算法:插入排序、合并排序、冒泡排序等,以及递归分治算法等内容。
1、循环不变式
循环不变式主要用来说明算法的正确性,那么什么是循环不变式呢,其实就是在循环过程中,一些元素数据必须保持的一些性质,例如在插入排序中,数组为A,必须保证三个性质:
(1) 初始化:在循环开始之前,循环不变式是成立的,即:A[0]是有序的,A[1...n-1]是无序的。
(2) 保持:在循环的某一次迭代开始之前,循环不变式是成立的,那么在此次迭代结束后依然应该是成立的,即:A[0...i]是有序的,A[i+1...n-1]是无序的。
(3) 终止:当循环结束的时候,从循环不变式就可以得出我们的算法的正确性,即:整个数组A是有序的,排序成功。
插入排序
/*
* 算法导论 第二章 插入排序
* 使用增量方法,依次遍历数组并逐个插入有序队列
* 插入时从后至前,找到不大于当前元素的第一个位置
* 将此位置后面的元素一次向后移动,将元素插入此位置
* 时间复杂度为O(n^2)
*/
#include <iostream>
#include <ctime>
using namespace std;
void printArray(int arr[], int len)
{
for (int i=0; i<len; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
void insertionSort(int *arr, int len);
void binaryInsertSort(int *arr, int len);
int main()
{
int len = 12;
int *arr = new int[len];
srand(time(NULL));
for (int i=0; i<len; i++)
{
arr[i] = rand() % 100;
}
cout << "原数组:" << endl;
printArray(arr, len);
insertionSort(arr, len);
cout << "直接插入排序后的数组:" << endl;
printArray(arr, len);
for (int i=0; i<len; i++)
{
arr[i] = rand() % 100;
}
cout << "原数组:" << endl;
printArray(arr, len);
binaryInsertSort(arr, len);
cout << "二分插入排序后的数组:" << endl;
printArray(arr, len);
return 0;
}
/*
* 直接插入排序
* 时间复杂度为O(n^2)
*/
void insertionSort(int *arr, int len)
{
for (int i=1; i<len; i++)
{
int temp = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > temp)
{
arr[j+1] = a