再谈直接插入排序之前首先来谈谈什么是排序?
1、排序:所谓排序就是整理文件中的记录,使之按关键字递增(或递减)的次序排列起来
2、稳定排序与不稳定排序:
假设 Ki = Kj ,且排序前序列中 Ri 领先于 Rj ;
若在排序后的序列中 Ri 仍领先于 Rj ,则称排序方法是稳定的。
若在排序后的序列中 Rj 仍领先于 Ri ,则称排序方法是不稳定的。
3、算法的复杂性:体现在运行该算法时的计算机所需资源的多少上(时间和空间资源)
算法复杂度分为时间和空间复杂度。
4、时间复杂度:简单的说就是程序循环执行的总的次数。算法的时间复杂度是一个函数,
它定量描述了该算法的运行时间。时间复杂度常用大O符号表述,即O(f(n))。
5、辅助空间:辅助空间是评价排序算法的一个重要指标,辅助空间是指除了存放待排序资源之外,
执行算法所需要的其他存储空间。
那么接下来我就来介绍直接插入排序了:
首先直接插入排序是一种插入排序它和希尔排序一样都属于插入排序,也是一种稳定的排序;
时间复杂度:最好情况:O(n) 最坏情况:O(n2) 平均情况:O(n2);
空间复杂度:O(1)
那么直接插入排序的主要思想是什么呢?
首先将一组数据分为有序区和无序区,假设第一个为有序区,其余为无序区,接着将无序区的第一个与有序区按从小到大的顺序进行比较,
插入有序区,直到无序区最后一个插入为止。
下面是我写的直接插入排序的代码:
#include <stdio.h>
void InsertSort(int par_array[], int length) //本次排序按照从小到大的顺序
{
int i, j;
int temp ;
for (i = 1; i < length; i++) //比较 length-1 次
{
temp = par_array[i]; //定义一个变量 插入有序区的时候要用到
for (j = i - 1; j >= 0; j--)
{
if (temp < par_array[j]) //无序区的第一个与有序区从后往前比较
{
par_array[j + 1] = par_array[j]; //满足条件将数据往后面移一格
}
else
{
break;
}
}
par_array[j + 1] = temp; //插入到有序区
}
}
int main1()
{
int i;
int a[] = {2, 3, 44, 2, 13, 55, 22, 88, 0, 7};
int len = sizeof(a) / sizeof(a[0]); //求数组的长度
InsertSort(a, len);
for (i = 0; i < len; i++) //打印数据
{
printf("%d ",a[i]);
}
printf("\n");
return 0;
}