基本思想
再插入第i个元素时,前面i-1个已经排好序。
排序过程
初始状态(假设第一个元素为有序,其余均为无序元素)
问题一:如何构建初始的有序序列?
办法
将第一个记录看成是初始有序表,然后从第二个记录依次插入到这个有序表中。
算法:
for(i=2;i<=n;i++)
{
插入第i个记录
}
问题二:如何查找带插入记录的插入位置?
办法
算法描述:
void insertSort(int r[], int n)
{
for (int i = 0; i <= n; i++)
{
// 给要插入到元素让出位置
r[0] = r[i];
int j = i - 1;
while (r[0] < r[j])
{
r[j + 1] = r[j];
j--;
}
r[j + 1] = r[0];
}
}
性能分析
适合于待排序记录基本有序或者待排序数据记录较小时。
练习
void SORT(int arr[], int len)
{
for (int i = 2; i <= len; i++)
{
arr[0] = arr[i];
int mid = (i + 1) / 2;
if (arr[0] > arr[mid])
{
int j = i - 1;
while (j > mid && arr[j] > arr[0])
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = arr[0];
}
else
{
int j = mid - 1;
for (int k = i - 1; k > j; k--)
{
arr[k + 1] = arr[k];
j--;
}
arr[j + 1] = arr[0];
}
}
}