注意不同点:直接插入排序重点在已排序部分,在排序刚开始时就把数组第一个元素作为已排序部分。每次都把未排序部分的第一个元素与已排序部分比较找到插入位置,这样才可保证排序。
void InsertSortArray(int arr[] , int n)
{
for(int i=1;i<n;i++)//循环从第二个数组元素开始,因为arr[0]作为最初已排序部分
{
int temp=arr[i];//temp标记为未排序第一个元素
int j=i-1;
while (j>=0 && arr[j]>temp)/*将temp与已排序元素从大到小比较,寻找temp应插入的位置*/
{
arr[j+1]=arr[j];
j--;
}
arr[j+1]=temp;
}
}
因为重点在于已排序部分数组的作用,第一次定数组首项为已排序部分,接下来的i-1次比较均是未排序部分的首项与前面已排部分的插入。每次比较,将未排部分首项(注意用temp表示,因为可能被覆盖)与前项比,如果小于前项则前项整体向后平移,直到遇到比temp小的项停止。这时就找到了该项的插入位置(由于是和已排好部分比较,故遇见比其小的项之前一定都比其小),这就是直接插入排序。