从本章开始我们就来一起实现内部排序算法。当然我们为了抓住算法的本质而抛开其实际的应用,我们为了排序算法的简明扼要,排序算法本身所涉及到的数据结构中只是单纯的整数,在实际应用中可能是任何数据类型做为其关键字,并有一个存放数据的指针。而我们所使用的数据结构也是比较常见的线性表。数据存放在地址连续内存中的线性表,对其排序需要移动元素的位置,从而使线性表有序;而对于动态的线性表是通过指针来指向下一个元素的位置,那么需要修改其地址,从而使其有序。
现在我们来实现第一个排序算法——插入排序。插入排序是一种简单的排序方法,它的思想是从头到尾遍历线性表,将元素插入一个有序的子表中,从而得到一个有序表。在将元素插入一个有序表的时候,首先要找到其在有序子表中的插入位置。这其实是一个“查找”的过程,我们在第七章中实现了很多查找的算法,完全可以用在这里,比如利用折半查找来实现插入排序。在这里为了代码简洁明了只使用顺序查找。
#include <stdio.h>
#define SIZE (10)
//插入排序
void insert_sort(int *array, int size)
{
//从第2个元素开始
for (int i = 1; i < size; i++)
{
//取得当前元素值到t
int t = array[i];
//如果小于有序子表的最大值
if (t < array[i - 1])
{
//插入有序子表
for (int j = i; j > 0; j--)
{
//依次后移一个元素
array[j] = array[j - 1];
//如果找到插入位置
if (t >= array[j - 1])
{
//插入t到有序子表
array[j] = t;
break;
}
//如果t大于有序子表的第1个元素
if (j == 1 && t < array[0])
{
//插入t到有序子表的第1个位置上
array[0] = t;
break;
}
}
}
}
}
//显示数组
void display(int *array, int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
int main(int argc, char **args)
{
int array[SIZE] =
{ 9, 3, 1, 2, 5, 8, 7, 0, 6, 4 };
//显示数组
display(array, SIZE);
//插入排序
insert_sort(array, SIZE);
//显示数组
display(array, SIZE);
return 0;
}
运行结果:
9 3 1 2 5 8 7 0 6 4 0 1 2 3 4 5 6 7 8 9
本例代码:
code path chapter.02/e.g.8.1/ https https://github.com/magicworldos/datastructure.git git git@github.com:magicworldos/datastructure.git subverion https://github.com/magicworldos/datastructure
Copyright © 2015-2023 问渠网 辽ICP备15013245号