采用插入排序对一组无序元素进行排序
实现代码
void InsertSort(int *arr, int size)//插入排序简单版
{
if (NULL == arr || size <= 0)
return;
for (int idx = 1; idx < size; idx++)
{
int start = idx - 1;
int temp = arr[idx];
while (start >= 0 && arr[start] > temp)
{
arr[start + 1] = arr[start];
start--;
}
arr[start + 1] = temp;//循环出来start已经多减了一个1已经小于0了。
}
}
上述算法由于在找到插入位置前每个元素都需要比较,因此我们对此进行优化
void Insert_Quck(int *arr, int size)//插入排序优化版
{
if (NULL == arr || size <= 0)
return;
for (int idx = 1; idx < size; idx++)
{
int start = idx - 1;
int left = 0;
int right = idx;
int mid = 0;
int temp = arr[idx];
while (left < right)//寻找插入位置
{
mid = left + ((right - left) >> 1);
if (arr[idx] > arr[mid])
{
left = mid + 1;
}
else
right = mid - 1;
}
while (start > left)//start大于寻找的插入位置才需要搬移等于的话相当于插入位置就在前一个需要判断看是否需要交换
{
arr[start + 1] = arr[start];
start--;
}
//循环出来start在left的位置上
if (arr[start] > temp)//同样已解决了插入位置就在start上的问题
{
arr[start + 1] = arr[start];
start--;
}
arr[start+1] = temp;
}
}