排序算法的分类:1、内排序 数据在内存存放 2、外排序 数据存放在磁盘(内存比磁盘小,因此存储的数据量少)
八大内排序的划分:
- 插入排序(1、直接插入排序,2、希尔shell排序)
- 选择排序(3、简单选择排序,4、堆排序)
- 交换排序(5、冒泡排序,6、快速排序)
- 归并排序(7、归并排序)
- 基数排序又称桶排序(8、基数排序又称桶排序)
插入排序:拿到一个数据将该数据插入到合适的位置
直接插入排序:将数据分为两部分 已排序部分和待排序部分,将待排序部分数据插入到已排序部分
直接插入排序步骤:
- 拿到待排序的一个数据并且保存在变量中
- 用这个数据和已排序的数据从尾部数据开始比较;如果大于已排序数据的最后一个数据则不移动;如果小于则将已排序数据的最后一个数据向右移动一个,再拿这个数据和前一个数据比较
代码实现:
void InsertSort(int arr[],int len)
{
int i=1;
int j=i-1;
int tmp;
for(i;i<len;i++)
{
tmp=arr[i];
for(j=i-1;j>=0 && arr[j]>tmp;j--)
{
arr[j+1]=arr[j];
}
arr[j+1]=tmp;
}
}
void ShowArr(int arr[],int len)
{
int i=0;
for(i;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[]={12,3,24,6,3,43,2}
int len=sizeof(arr)/sizeof(arr[0]);
ShowArr(arr,len);
InsertSort(arr,len);
ShowArr(arr,len);
return 0;
}
时间复杂度:o(n^2)
空间复杂度:额外的空间只有tmp,因此是o(1)
稳定性:(相同元素在排序前后相对应位置是否发生变化)稳定的