大道理什么的我已经不想多讲,直接上一些让自己重新理解问题的笔记才是硬核之事。今天我写的代码是排序问题,这是一个很古老,也是算法开课绕不开的问题,有很多种形态各样的排序算法——冒泡排序、插入排序、归并排序,快速排序、堆排序、希尔排序等等。
今天我首先想接触的是插入排序和归并排序两种。首先来看一下插入排序——
插入排序
主要思路是将一个新的数据插入到一个已经排好序的数组中,然后依次进行最终完成排序,这个算法的时间复杂度是 O ( n 2 ) O(n^2) O(n2),主要的问题存在于,由于数组是连续的空间,因此插入操作,实际上是两个相邻的数组之间比较大小然后交换位置的过程的重复。
——我先写出伪代码
## 输入:数组A
## 输出:排好序的数组A
for i in 2 to n:
for j in i to 0:
if A[j] < A[j - 1] ## 根据结果从大到小还是从小到大决定大于小于号
swap(A[j - 1], A[j])
以下是插入排序的C++代码实现:
#include <iostream>
#define Length(A, B) (sizeof(A) / sizeof(B))
void insert_sort(int *, int);
void swap(int &, int &);
void display(int *, int);
int main(int argc, char const *argv[])
{
int A[] = {3, 2, 5, 4, 8, 7, 6};
int length = Length(A, int);
display(A, length);
insert_sort(A, length);
display(A, length);
return 0;
}
void insert_sort(int A[], int length)
{
if (A == nullptr)
return;
if (lengt