这个算法很简单,时间复杂度也是n*n.
原理是:以升序排列为例。遍历从第一个开始,遍历到一个元素时,不断和前一个元素比较,如果前一个元素比自己大,则和前一个元素对调,继续喝前一个元素比较,直到前一个元素比自己小(不比自己大)。
废话不多说,看代码:
class InsertSorter
{
public bool Sort(ref int[] numbers, int arrSize)
{
doInsertSort(ref numbers, arrSize);
return true;
}
private void doInsertSort(ref int[] numbers, int arrSize)
{
for (int pos = 1; pos < arrSize; pos++)
{
doInsert(ref numbers,pos);
}
}
//如果前一个元素比numbers[pos]大,就和前一个交换。
private void doInsert(ref int[] numbers, int pos)
{
int num = numbers[pos];
//prePos表示下一个比较的位置
while (true)
{
int prePos = pos - 1;
if (prePos < 0)
break;
if (numbers[prePos] > numbers[pos])
{
Swap(ref numbers, prePos, pos);
pos = prePos;
}
else
{
break;
}
}
}
private void Swap(ref int[] numbers, int idx1, int idx2)
{
int temp = numbers[idx1];
numbers[idx1] = numbers[idx2];
numbers[idx2] = temp;
}
}