直接插入排序
先通过一个例子来体会下插入排序的执行流程
例如原始序列 int array[10] = {11, 12, 44, 33, 56, 7, -5, 99, 8, 5};
1.一开始看到数组第一个元素array[0] = 11, 这个数当然是有序的
11 12, 44, 33, 56, 7, -5, 99, 8, 5
2.插入第1个元素 12 因为12 > 11, 所以不需要移动
11, 12 44, 33, 56, 7, -5, 99, 8, 5
3.插入第2个元素44 因为44 > 12, 所以不需要移动
11, 12, 44, 33, 56, 7, -5, 99, 8, 5
4.插入第3个元素33 因为33 < 44, 所以44,需要后移一位,33插入到原来44的位置,但是33>12,
所以12不需要移动
11, 12, 33, 44 56, 7, -5, 99, 8, 5
4.插入第4个元素56 因为56 > 44, 所以不需要移动
11, 12, 33, 44, 56 7, -5, 99, 8, 5
5.插入第5个元素7 因为56 > 7, 所以56后移一个位置,因为44 > 7, 所以44后移一个位置,同理33>7
33后移一个位置,同理可的到最后的有序序列
7, 11, 12, 33, 44, 56 -5, 99, 8, 5
。。。。。。。
最后可得到得有序序列
-5 5 7 8 11 12 33 44 56 99
#include <stdio.h>
#include <stdlib.h>
//待排序的数据放到array中,数组元素个数为n个
void InsertSort(int array[], int n)
{
int i, j;
int temp;
for (i = 1; i < n; i++)//数组从下标0开始存储,第一个元素有序,所以从第二个元素开始处理
{
temp = array[i];//将待插入的元素暂存在temp中
j = i-1;
//从待排元素之前的元素开始扫描,如果大于待排元素,则后移一位
while (j >= 0 && temp < array[j])
{
array[j+1] = array[j];
--j;
}
//找到要插入位置,把temp中暂存的元素插入
array[j+1] = temp;
}
}
//输入数组的函数
void prinT(int array[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%d\t", array[i]);
printf("\n");
}
int main()
{
int array[10] = {11, 12, 44, 33, 56, 7, -5, 99, 8, 5};
prinT(array, 10);
InsertSort(array, 10);
prinT(array, 10);
return EXIT_SUCCESS;
}
先通过一个例子来体会下插入排序的执行流程
例如原始序列 int array[10] = {11, 12, 44, 33, 56, 7, -5, 99, 8, 5};
1.一开始看到数组第一个元素array[0] = 11, 这个数当然是有序的
11 12, 44, 33, 56, 7, -5, 99, 8, 5
2.插入第1个元素 12 因为12 > 11, 所以不需要移动
11, 12 44, 33, 56, 7, -5, 99, 8, 5
3.插入第2个元素44 因为44 > 12, 所以不需要移动
11, 12, 44, 33, 56, 7, -5, 99, 8, 5
4.插入第3个元素33 因为33 < 44, 所以44,需要后移一位,33插入到原来44的位置,但是33>12,
所以12不需要移动
11, 12, 33, 44 56, 7, -5, 99, 8, 5
4.插入第4个元素56 因为56 > 44, 所以不需要移动
11, 12, 33, 44, 56 7, -5, 99, 8, 5
5.插入第5个元素7 因为56 > 7, 所以56后移一个位置,因为44 > 7, 所以44后移一个位置,同理33>7
33后移一个位置,同理可的到最后的有序序列
7, 11, 12, 33, 44, 56 -5, 99, 8, 5
。。。。。。。
最后可得到得有序序列
-5 5 7 8 11 12 33 44 56 99
#include <stdio.h>
#include <stdlib.h>
//待排序的数据放到array中,数组元素个数为n个
void InsertSort(int array[], int n)
{
int i, j;
int temp;
for (i = 1; i < n; i++)//数组从下标0开始存储,第一个元素有序,所以从第二个元素开始处理
{
temp = array[i];//将待插入的元素暂存在temp中
j = i-1;
//从待排元素之前的元素开始扫描,如果大于待排元素,则后移一位
while (j >= 0 && temp < array[j])
{
array[j+1] = array[j];
--j;
}
//找到要插入位置,把temp中暂存的元素插入
array[j+1] = temp;
}
}
//输入数组的函数
void prinT(int array[], int n)
{
int i;
for (i = 0; i < n; i++)
printf("%d\t", array[i]);
printf("\n");
}
int main()
{
int array[10] = {11, 12, 44, 33, 56, 7, -5, 99, 8, 5};
prinT(array, 10);
InsertSort(array, 10);
prinT(array, 10);
return EXIT_SUCCESS;
}