1、程序文件
#include <stdio.h>
// 交换
void mySwap(int *a, int i, int j)
{
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
// 打印
void myPrint(int *a, int len)
{
int i;
for (i = 0; i < len; i++)
{
printf ("%4d", a[i]);
}
printf ("\n");
}
// 插入排序
void mySort(int *a, int len)
{
int i;
// 在一个已经排好序的数组里插入新元素
// 只取数组里的第一个元素,然后把第二个元素往第一个元素里面插
// 从后往前找第一个比它小的元素
// 一边循环,一边找位置
// 元素不符合要求就将其后移
// 符合要求就不移
// 先是第一个元素有序,插入后,变成两个元素有序
for (i = 1; i < len; i++)
{
// 将当前下标为i的数组元素的值保存在get里
int get = a[i];
// 把get的前一元素通过j保存下来
int j = i - 1;
// j >= 0 ==> 防止越界
// 一旦get保存的值,遇到更小的a[j]就退出
// 然后在j+1位置处插入get
// 或者循环到数组首元素/已遍历其之前的所有元素
while (j >= 0 && get < a[j])
{
// 把较大值后移
// 或者说是把不符合条件的值后移
// 把比get大的值后移
// 拿get和a[j]进行比较,只要比get大,就把a[j]后移
// 移完后空出的位置,插入get
a[j+1] = a[j];
j--;
}
// a[j]的位置是比get小的位置
// 插在其后的位置
a[j+1] = get;
}
}
int main()
{
int a[] = {9,8,7,6,5,4,3,2,1,0};
int len = sizeof(a)/sizeof(a[0]);
mySort(a, len);
myPrint(a, len);
return 0;
}
2、测试结果
root@lj:/mnt/hgfs/shared-lj# gcc 插入排序study.c
root@lj:/mnt/hgfs/shared-lj# ./a.out
0 1 2 3 4 5 6 7 8 9