1.依次插入排序
依次插入指的是在一个有序数组当中依次插入一个新的数据,这样在所有的数据都插入之后,这个数据就是一个有序的数组了。另外依次插入数据排序的思想和我们玩扑克牌时依次拿牌后整理牌的思路很是相似。
将其抽象到咱们的排序当中就是如下的思路:
例如我们要在2 3 6 8当中插入5这个数据时,我们的排序的思路将是如下面图所示
让我们来看看上面的四步排序,我们将尾部的数据数组下标记作end,首先我们将5和尾部数据8进行比较,由于8大于5所以将8和5的位置进行交换,然后将尾部的end减1,此时end的位置上的数据就是6,然后我们拿6和5进行比较,然后将6和5的位置进行交换,end减1,重复上述的步骤,直到整个数组排成有序的数组。
代码展示如下:
void DirectSort(struct information* ps,int x)
{
int end = ps->size - 1;
while (end >= 0)
{
if (ps->head[end] > x)
{
ps->head[end + 1] = ps->head[end];
end--;
}
else
{
break;
}
}
ps->head[end + 1] = x;
}
2.整个数组进行插入排序
整体进行插入排序是和依次插入排序进行相比较来讲的,他是整个数组的数据都已经就位,然后再将整个数据进行插入排序。拿刚刚提到的扑克牌来讲,就是此时所有的牌都已经拿到手了,这时就需要将整体进行插入排序了。
例如我们就拿9 1 2 5 7排序来进行举例:
首先将第一个数据的下标记作end,然后将第二个数和第一个数进行比较,看是否需要进行交换,然后将end加1,然后依次进行下去。
代码的展示如下:
#include<stdio.h>
void swap(int* front, int* back)
{
int middle = *front;
*front = *back;
*back = middle;
}
void DirectSort(int* pHead,int size)
{
for (int i = 0; i < size-1; i++)
{
int end = i;
while (end >= 0)
{
if (pHead[end + 1] < pHead[end])
{
swap(&pHead[end], &pHead[end + 1]);
end--;
}
else
{
break;
}
}
}
}
void Print(int* pHead,int size)
{
for (int i = 0; i < size; i++)
{
printf("%d ", pHead[i]);
}
printf("\n");
}
int main()
{
//定义数组
int DirectArr[10] = { 9,6,3,8,5,2,7,1,4,5 };
//求取数组的长度
int size = sizeof(DirectArr) / sizeof(DirectArr[0]);
//排列之前的数组
Print(DirectArr, size);
//直接排序函数
DirectSort(DirectArr,size);
//排列之后的数组
Print(DirectArr,size);
return 0;
}