数据结构之直接插入排序
直接插入排序:是其他插入排序的基础
第一步:确定要插入的数据。
for(int i=1;i<dataCount;i++)//从第二个数据开始依次遍历要插入的数据
此为外层循环,固定执行n-1次
第二步:找到要插入的位置并插入。
在指定索引位置插入一个数据,需要【从数据尾部】开始依次向后移动一位直到到达索引位置:
int data=L[i];//用来存储要插入的数据
for(int j=i;((isUp && L[j - 1] > data) || (!isUp && L[j - 1] < data))&& j >0;j--)
//该逻辑表示一个选择器,可以通过改变bool isUp的值来改变结果的升降序
L[j] = L[j - 1];
L[j] = data;
内层循环的次数是不固定的(0次-j次),这是插入排序优势的关键。
最坏的情况(逆序):
内层循环执行 j 次,总共需要(n-1)^2/2次比较和移动
时间复杂度为T(n^2)
最好的情况(顺序):
内层循环只执行了一次判断,而且没有移动数据,所以总共执行了n-1次比较,0次移动
时间复杂度为T(n)
基本有序的情况(数据折线图整体为升序或者是降序):
根据有序度,我们只需要进行较少的比较和移动 ,时间复杂度在T(n)---T(n^2)之间。
算法分析:
时间复杂度:T(n)---T(n^2)//有序度来决定的
空间复杂度:O(1)
所以我们如果要排序的序列是基本有序的话,可以选择使用插入排序。
//整体代码
public static void InsertSort(ref int[] L,int dataCount,bool isUp)
{
int j=0;
//两层循环,外层表示每个元素的插入操作
//内层表示每个元素的插入细节;
for (int i = 1; i < dataCount; i++)//外层
{
int data = L[i];
for(int j=i; ((isUp && L[j - 1] > data) || (!isUp && L[j - 1] < data)) && j >0;j--)
L[j] = L[j - 1];
L[j] = data;
}
}