算法作为计算编程中的重要组成部分,其意义显而易见,所以我选择算法和数据结构中的经典书籍《算法导论》作为主要参考书目来深入学习算法和数据结构的内容。
输入:n个数(a1,a2,a3...an)
输出:输入序列的一个排列(重新排序)a'1,a'2,a'3...a'n,使得a'1≥a'2≥a'3≥...≥a'n。
引用《算法导论》书中的解释,插入排序算法可以比喻为我们平常整理扑克牌的情形。接到牌的时候,牌的顺序是杂乱的,我们将其一张一张整理好,最后呈现的就是从小到大的顺序。回顾我们整理扑克牌的过程,从杂乱的牌堆中一张一张抽取扑克牌,放入手中,并且放入适合的位置,直到所有的扑克牌都整理完毕。
由此得到插入排序算法的伪代码如下:
for j : 1 to length[A]-1
do key = A[j]
i = j - 1
while i > 0 and A[i] > key
do A[i + 1] = A[i]
i = i - 1
A[i + 1] = key
对于实例A[5, 2, 4, 6, 1, 3]C++实现插入排序。
#include
int main(void)
{
int A[6]={5, 2, 4, 6, 1, 3};
int key = 0;
int i = 0;
for (int j = 1; j < 6; j++)
{
key = A[j];
i = j - 1;
while (i >= 0 && A[i] > key)
{
A[i + 1] = A[i];
i--;
}
A[i + 1] = key;
}
for (int i = 0; i < 6; i++)
std::cout << A[i] << " ";
return 0;
}
书中练习2.2-2中提到了选择排序,再次比喻为整理扑克牌情形,从牌堆中寻找最小的那张牌依次放入手中,最后得到的就是有序的牌。
选择排序的伪代码如下:
for j : 0 to length[A] - 1
do key = A[j]
i : j+1 to length[A]-1
if A[i] < key
A[i] <->key
C++实现某一示例无序数组。
#include
int main(void)
{
int A[6]={5, 2, 1, 3, 6, 4};
int key = 0;
int keyid = 0;
int i = 0;
for (int j = 0; j < 6; j++)
{
key = A[j];
for (i = j + 1; i < 6; i++)
{
if (A[i] < key)
{
key = A[i];
keyid = i;
}
}
A[keyid] = A[j];
A[j] = key;
}
for (i = 0; i < 6; i++)
std::cout << A[i] << " ";
return 0;
}
这两种排序算法不适用于比较庞大的数据。