直接插入排序
直接插入排序:(越有序越快,完全有序则为O(n))
将待排序数据分成两部分,左部分为已经排序好的数据,右部分为待排序数据,从右边的数据中取一个数,插入到左边部分,并且使左边数据依旧有序
如果只有一个数据,则认为其已经有序。
升序:从已排好序的序列中,从右向左开始和待插入的值相比较,如果大于待插入的值,则向右移动一位,反之则听下来,并且将数据插入到后面。
时间复杂度:最坏O(n^2)
平均O(n^2)
最好O(n) -->数据完全有序时
空间复杂度:O(1)
稳定性:不稳定
举例说明具体实现
初始序列:41 67 34 0 69 24 78 58 62 64
直接插入排序后的序列
0 24 34 41 58 62 64 67 69 78
代码实现
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define DATANUM 10
void Show(int* arr, int length)
{
for (int i = 0; i < length; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
int IsOrder(int* arr, int length)
{
for (int i = 0; i < length - 1; i++)
{
if (arr[i] > arr[i + 1])
{
return 0;
}
}
return 1;
}
void DirectInsertion_Sort(int* arr, int length)
{
assert(arr != NULL || length > 1);
if (arr == NULL || length < 2)
{
printf("DirectInsertion_Sort:Invalid Array\n");
return;
}
int j = 0;
for (int i = 1; i < length; i++)
{
int tmp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > tmp; j--)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = tmp;
}
}
int main()
{
int arr[DATANUM];
for (int i = 0; i < DATANUM; i++)
{
arr[i] = rand() % 100;
}
printf("Before DirectInsertion_Sort:");
Show(arr, DATANUM);
DirectInsertion_Sort(arr, DATANUM);
if (IsOrder(arr, DATANUM))
{
printf("After DirectInsertion_Sort:");
Show(arr, DATANUM);
}
else
{
printf("DirectInsertion_Sort Failed\n");
}
return 0;
}