1、算法基本思想
第一个数不需要排序,因此比较趟数 i 为[1, size-1]或者[1, size),j 从 i-1 这个位置开始比较(从后往前找),最后比较到下标为0的位置或者第一个不大于array[i]的数,比array[i]大的数都向后移动一格,这样其实就相当于空出来一格,如果找到不大于array[i]的数,就把array[j]放到该位置的下一个位置。
2、源代码
InsertSort
/*
* 函数名称:InsertSort
*
* 函数功能:直接插入排序(普通)
*
* 入口参数:array, size
*
* 出口参数:void
*
* 返回类型:void
*/
void InsertSort(int array[], int size)
{
int i = 0;
int j = 0;
int key = 0;
for (i = 1; i < size; i++)
{
//防止array[i]在交换数据的过程中发生变化
key = array[i];
//依次比较key和key之前的数,以及key的前一个数的前一个数,依此类推
for (j = i - 1; (j >= 0) && (array[j] > key); j--)
{
//不交换数据,直接用前一个数替换掉后一个数,这样就可以空出来一个格子
array[j + 1] = array[j];
}
//此时array[j] <= key,在该位置的下一个位置插入key即可
array[j + 1] = key;
}
return;
}
main
#define _CRT_SECURE_NO_WARNINGS 1
/*
* Copyright (c) 2018, code farmer from sust
* All rights reserved.
*
* 文件名称:InsertSort.c
* 功能:插入排序
*
* 当前版本:V1.0
* 作者:sustzc
* 完成日期:2018年7月8日10:46:23
*/
# include <stdio.h>
/*
* 函数名称:main
*
* 函数功能:测试主程序
*
* 入口参数:void
*
* 出口参数:0
*
* 返回类型:int
*/
int main(void)
{
int i = 0;
int numbers[] = {3, 1, 6, 4, 5, 2};
int len = sizeof(numbers) / sizeof(int);
printf("排序之前:\n");
for (i = 0; i < len; i++)
{
printf("%d ", numbers[i]);
}
InsertSort(numbers, len);
printf("\n排序之后:\n");
for (i = 0; i < len; i++)
{
printf("%d ", numbers[i]);
}
printf("\n");
return 0;
}
优化
前面有序,查找时用二分查找。
/*
* 函数名称:InsertSort
*
* 函数功能:直接插入排序(优化,二分法)
*
* 入口参数:array, size
*
* 出口参数:void
*
* 返回类型:void
*/
void InsertSort(int array[], int size)
{
int i = 0;
int j = 0;
int key = 0;
int left = 0;
int right = 0;
int mid = 0;
for (i = 1; i < size; i++)
{
left = 0;
right = i - 1;
//防止array[i]在交换数据的过程中发生变化
key = array[i];
while (left <= right)
{
mid = (left & right) + ((left ^ right) >> 1);
if (array[mid] <= key)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
//left是要插入的位置
for (j = i; j > left; j--)
{
//数据的搬移
array[j] = array[j - 1];
}
array[j] = key;
}
return;
}
3、输出结果