直接插入排序:
将待排序元素与已经排序好的序列进行比较插入其中。时间复杂度为O(n2)
void InsertSort(SqList L, int n)
{
for (int i = 1; i < n; i++)
{
ElemType temp;
if (L[i] < L[i - 1])
{
temp = L[i];
for (int j = i; j >= 0; j--)
{
if (j>0&&L[j - 1] > temp)
L[j] = L[j - 1];
else
{
L[j] = temp;
break;
}
}
}
}
}
折半插入:
当数据量过多时则需要使用到折半插入,与前面一样,依然是将待排序元素插入到已排序好的序列中,high+1或者low的位置是需要插入的地方。此方法相对于直接插入近减少了比较次数,但是移动次数并未减少。时间复杂度依然为O(n2)
void BInsertSort(SqList L, int n)
{
for (int i = 1; i < n; i++)
{
int temp = L[i];
int low = 0;
int high = i - 1;
while (low <= high)
{
int mid = low + (high - low) / 2;
if (temp >= L[mid])
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
for (int j = i; j > high + 1; j--)
{
L[j] = L[j - 1];
}
L[high + 1] = temp;
}
}
二路插入排序:
额外申请一样空间大小的辅助区域,首先将待排序序列的第一个元素复制给辅助区域的第一个,然后设至head和tail头尾标记,形成循环结构,若大于等于tail则在tail后面插入,若小于head则在head前插入,若既不大于也不小于,则在中间开始插入。
void TWayInsert(SqList L, int n)
{
SqList T;
T[0] = L[0];
int head = 0,tail=0;
for (int i = 1; i < n; i++)
{
if (L[i] < T[head])
{
head = (head - 1 + n) % n;
T[head] = L[i];
}
else if (L[i] >= T[tail])
{
tail++;
T[tail] = L[i];
}
else
{
T[tail+1] = T[tail];
tail++;
int j;
for (j = tail; j != head; j = (j - 1 + n) % n)
{
if (L[i] >= T[(j - 1 + n) % n])
break;
else
T[j] = T[(j - 1 + n) % n];
}
T[j] = L[i];
}
}
for (int i = 0; i < n; i++)
{
L[i] = T[head];
head = (head + 1) % n;
}
}