插入排序算法
插入排序是最简单的一种排序算法,它的核心思想即在于首先得到一个已经排好序的序列,然后从这个排好的序列后面开始与前面序列的各个数字进行比较,升序排序情况下,如果这个数字比它大,那么就把这个数字放到后面去,如果前面的这个数字比它小,由于前面的数字都已经是排好了的序列,因此前面的数字必定都比这个数字小,所以此时循环就可以终止了,直接用break跳出,源代码如下
void Sort::insertionSortDescend()
{
int key;
for (int i = 1; i < 10; i++)
{
key = a[i];
int j;
for (j = i - 1; j >= 0; j--) {
//if this number is less than the present number, put it back
if (a[j] < key)
{
a[j + 1] = a[j];
}
else
break;
}
a[j + 1] = key;
}
}
void Sort::insertionSortAscend()
{
int key;
for (int i = 1; i < 10; i++) {
key = a[i];
int j;
for (j = i - 1; j >= 0; j--) {
if (a[j] > key)
{
a[j + 1] = a[j];
}
else
break;
}
a[j + 1] = key;
}
}
- 复杂度分析
- 最好的情况
在最好的情况下,该序列即为已经排好序的,不需要进行交换,其运行时间即为每条语句执行的时间,共执行了n-1次,因此其时间复杂度为 θ(n) θ ( n ) - 最坏的情况
最坏的情况,即为该序列为反着排序的,每一次都需要进行交换,因此是一个双重循环,其交换的总次数为 n(n−1)/2−1 n ( n − 1 ) / 2 − 1 因此此时其时间复杂度为 θ(n2) θ ( n 2 ) - 平均情况
时间复杂度为 θ(n2) θ ( n 2 )
- 最好的情况