插入排序的基本思路:
将n个元素的数列分为已有序和无序两个部分
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中
具体C语言实现(从小到大,只是简单测试了一下,不知道有没有bug...)
#include
#include
/* 交换两个数据的值 */
void swap(int *a, int *b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
/* 将一个数组的最后一个数据插入到某个位置,此位置之后的元素依次延后 */
/* int data[]: 待处理数据 */
/* int insert_pos: 插入位置 */
/* int size: 待处理数据个数 */
void Insert (int data[], int insert_pos, int size)
{
printf("--%s,%d-- IN\n",__FUNCTION__,__LINE__);
int i;
if (size < 2) {
/* 无需排序 */
return;
}
i = insert_pos;
for (; i < size - 1; i++) {
swap(&data[i],&data[size - 1]);
}
printf("--%s,%d-- OUT\n",__FUNCTION__,__LINE__);
}
/* 插入排序 */
/* int data[]: 待排序数据 */
/* int size: 数据个数 */
void InsertionSort(int data[], int size)
{
printf("--%s,%d-- IN\n",__FUNCTION__,__LINE__);
int i;
int sorted_max; //标记目前有序部分的位置(指向有序部分的最后一个元素)
if (size < 2) {
/* 数据只有一个或没有,无需排序 */
return;
}
sorted_max = 0;
while (sorted_max < size - 1) {
/* 将无序段中的第一个元素和有序段中的元素进行比较 */
for (i = 0; i <= sorted_max; i++) {
if (data[i] > data[sorted_max + 1]) {
/* 找到了比当前元素大的,进行插入操作 */
Insert(data, i, sorted_max + 2);
break;
}
}
sorted_max++;
}
printf("--%s,%d-- OUT\n",__FUNCTION__,__LINE__);
}
int main ()
{
int i;
int size = 9;
int data[] = {1,7,2,9,8,3,4,6,5};
InsertionSort(data, size);
for (i = 0; i < size; i++) {
printf("%d ",data[i]);
}
printf("\n");
system("pause");
return 0;
}