直接插入排序思想
将待排序序列看成两部分,左部分为已经有序的,右部分为无序的(第一次左部分只有一个数据)。循环从右部分拿一个数据插入到左部分中(从左部分的最后一个数据开始比较,如果比拿的数据大,则将其向后挪动一个位置,直到找到比他小的,或者左部分遍历完),并且使得插入后的结果依旧有序。直到有部分没有数据为止!
即将数组分为左右两部分,一开始左部分只有一个元素,左右部分想接触的两个数进行比较,若左边小于右边则不进行操作,若右边小于左边则,两元素交换并且继续向前比较,直到找到比该元素小的数字或者该元素已经是左部分最左边的元素。
直接插入排序
时间复杂度: 等差数列 O(n^2)
数据序列已经有序,则能达到最好时间复杂度: O(n)
数据趋于有序(部分有序): 时间复杂度就可以趋于 O(n),–》 数据越有序,时间复杂度越低。
空间复杂度: O(1)
稳定性: 稳定的
直接插入排序的实现
void InsertSort(int* arr, int len)
{
for (int i = 1; i < len ; i++)
{
int tmp = arr[i];
int j = i - 1;
while (arr[j] > tmp && j >= 0)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = tmp;
}
}
完整代码
#include<stdio.h>
#include<stdlib.h>
#include<cstdlib>
#include<cstdio>
#include<ctime>
void Show(int* arr, int len)
{
for (int i = 0; i < len; ++i)
{
printf("%d ", arr[i]);
}
printf("\n");
}
void Swap(int* a, int* b)
{
int c = *a;
*a = *b;
*b = c;
}
void IsSort(int* arr, int len)
{
for (int i = 0; i < len - 1; ++i)
{
if (arr[i] > arr[i + 1])
{
printf("无序\n");
return;
}
}
printf("有序\n");
}
void InsertSort(int* arr, int len)
{
for (int i = 1; i < len ; i++)
{
int tmp = arr[i];
int j = i - 1;
while (arr[j] > tmp && j >= 0)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = tmp;
}
}
int main()
{
int arr[10];
int i;
srand((unsigned int)time(0));
for (i = 0; i <= 9; i++)
{
arr[i] = rand() % 100;
}
Show(arr, 10);
InsertSort(arr, 10);
IsSort(arr, 10);
Show(arr, 10);
return 0;
}