思路分析
将一個待排序元素,按其大小,插入到前面已經排好序的一組元素的合适位置上去,直到元素全部插完為止。
簡單來說:end指已經排好數組的最後一個元素,end找到插入的位置(設定一個temp,temp為已經排序好數組的下一個元素),用temp與end比較,如果temp
代碼實作
void InsertSort(int array[], int size)
{
int end = ;//已經排好的最後一個數
int temp = ;//需要排序的數
for (int i = ; i < size - ; i++)
{
end = i;
temp = array[end + ];//将要排序的數标記
while (end >= && array[end]>temp)
{
array[end + ] = array[end];
end--;
}
array[end + ] = temp;
}
}
int main()
{
int n = ;
int array[] = { , , , , , , , , , };
InsertSort(array, );
for (; n < ; n++)
{
printf("%d", array[n]);
}
return ;
}
優化:二分查找直接排序
當數組長度過大的時候,找到要插入的位置會消耗大量資源,使用二分查找可以更快的找到插入位置。
/直接插入排序二分法
void InsertSort(int array[], int size)
{
int end;//已經排好的最後一個數
int temp;//需要排序的數
int left;//二分法左邊界
int right;//二分法右邊界
for (int i = ; i < size - ; i++)
{
end = i;
temp = array[i + ];
left = ;
right = end;
while (left <= right)
{
int mid = left + ((right - left)>>);//防止越界
if (array[mid]>temp)
{
right = mid - ;
}
else
{
left = mid + ;//等于mid的情況同樣插到後面
}
}
while (end >= && end >= left)
{
array[end + ] = array[end];
end--;
}
array[end + ] = temp;
}
}
int main()
{
int n = ;
int array[] = { , , , , , , , , , };
InsertSort(array, );
for (; n < ; n++)
{
printf("%d", array[n]);
}
return ;
}