插入排序:将待排序的数据元素与前面已经排好序的数据比较,将其插入到其中。每趟都是从待排序的数据元素开始扫描。
典型的插入排序算法有:
(1) 简单直接插入排序
(2) 希尔排序
简单直接插入排序代码:
bool InsertSort(int A[],int n)
{
if (A==NULL||n<0)
{
printf("Parameter for function InsertSort error!\n");
return false;
}
for (int i=1;i<n;i++)
{
int val = A[i];
int j = i-1;
while (j>=0&&A[j]<val) //降序
{
A[j+1] = A[j];
j--;
}
//A[j]>=val,val插在j的后面
A[j+1] = val;
}
return true;
}
简单直接插入排序时间复杂度为O(n2),它是一种稳定的排序算法。
希尔排序:又叫缩小增量的排序算法。假设增量值为d,则将隔间为d的元素分成一组,然后对每一组采用直接插入排序。
希尔排序代码如下:
//希尔排序又称缩小增量排序算法
bool ShellSort(int A[],int n)
{
if (A==NULL||n<0)
{
printf("Parameter for function ShellSort error!\n");
return false;
}
int d = n/2;
while(d>=1)
{
for (int i=d;i<n;i++)
{
int val = A[i];
int j = i-d;
while (j>=0&&A[j]<val)
{
A[j+d] = A[j];
j = j-d;
}
A[j+d] = val;
}
d = d/2;
}
return true;
}
希尔排序时间复杂度为O(n*log2n),它是一种不稳定的排序算法。