直接插入排序
概念:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
举例:
直接插入排序可以形象的理解为我们玩斗地主时对牌的排序,不过它是从最大的开始比较,比如你摸了4,7,4,8四张牌,当你摸到4时,你会毫不犹豫的拿着因为你知道这不用排大小,当你摸第二张牌7时,你会放到4的后面,接着你又摸到牌4,根据直接插入排序,你会先和牌7比较,比7小,往前继续比较,和牌4一样大,牌7往后一位,把新摸的牌4插入,后面摸牌的规则都是如此,直到牌被摸完。
直接插入排序特性:
1、排序的元素集合越有序,直接插入排序的时间效率越高。
2、时间复杂度:O(N^2)
3、空间复杂度: O(1)
4、稳定性: 稳定
代码实现
//Sort.h
#include<stdio.h>
#include<stdlib.h>
void InsertSort(int* a,int n);
void PrintArray(int* a,int n);
// Sort.c
#include"Sort.h"
void InsertSort(int* a,int n)
{
for(int i=0;i<n-1;i++)
{
int end=i;
int temp=a[end+1];
while(end>=0)
{
if(a[end]>temp)
{
a[end+1]=a[end];
end--;
}
else
{
break;
}
a[end+1]=temp;
}
}
}
void PrintArray(int* a,int n)
{
for(int i=0;i<n;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
//Test.c
#include"Sort.h"
void TestInsertSort()
{
int a[]={3,5,42,64,2,5};
InsertSort(a,sizeof(a)/sizeof(int));
PrintSort(a,sizeof(a)/sizeof(int));
}
int main()
{
TestInsertSort();
return 0;
}