插入排序的思路:从第2个数开始,依次循环把后一个数插入到前面已排序序列中。
上代码:
//1.无哨兵版
void InsertSort1(int[] arr,int nLength)
{
//检测数组
if(arr == null || nLength <=0) return;
int i;
int j;
int temp;
for(i = 1;i<nLength;i++)
{
//判断是否需要插入
if (arr[i-1] <= arr[i]) continue;
j = i-1; //有序的最后一个
temp = arr[i]; //待排序元素
//查找待排序元素的插入位置
while (j >= 0 && arr[j] > temp)
{
arr[j+1] = arr[j];//后移原有序元素,空出插入位置
j--;//确定插入位置
}
//插入待排序元素
arr[j + 1] = temp;
}
}
//2.有哨兵版
void InsertSort2(int[] arr, int nLength)
{
if(arr == null || nLength <=0)return;
int i;
int j;
int temp=arr[0];
for(i = 2;i<nLength;i++)
{
if (arr[i-1] <= arr[i]) continue;
j = i-1; //有序的最后一个
//仅与哨兵比较,防止越界
while(arr[j] > arr[0])
{
arr[j+1] = arr[j];
j--;
}
//插入待排序元素
arr[j+1] = arr[0];
}
//最后插入原来的哨兵元素
j = 1;
//查找待排序元素的插入位置
//并依次前移原有序元素
while(j < nLength && arr[j] < temp )
{
arr[j-1] = arr[j];
j++;
}
//插入待排序元素
arr[j-1] = temp;
}
插入排序的一般步骤:
1.判断是否需要插入
2.设置哨兵
3.后移元素,同时确定插入位置
4.插入元素