直接插入排序是在本数组中,从第二个元素开始,将其与第一个元素进行比较,如果比第一个元素大的话,不动进行第三个元素的排序,如果比第一个元素小就将第一个元素后移一位,将第二个元素插入到第一,然后进行第三个元素的比较......
//若当前数目比前面元素小的话,先通过循化来找到这个数字应该在此次循环中所排的位置,然后再通过循环将元素依次进行后移,将该数插入到指定位置。
void directInsert2(int *arr, int lenth)
{
if (arr == NULL) return;
for(int i=1; i<lenth; ++i)
{
int tmp = arr[i];
int j=i-1;
for( ; j>-1; --j)
{
if (arr[j]<tmp)
break;
}
int num = i;
while(num > j+1)
{
arr[num] = arr[num-1];
num--;
}
arr[num] = tmp;
}
}
//用当前元素与前面元素进行比较,如果比前面元素小的话,就与之交换数值,然后再判断其与当前位置的前一位的大小,如果小的话进行交换,直至找到比前面位置数值小的位置停止比较...
void insert_dirc1(int *arr, int len)//比较一次移动一次{
for(int i=1; i<len; i++)
{
int num = i;
while(num>0)
{
if (arr[num] < arr[num-1])
{
swap(&arr[num], &arr[num-1]);
}
else
{
break;
}
num--;
}
}
}
插入排序适合基本有序的数组的排序,如果数组中的数值基本有序,则数值需交换次数很少。但是如果按从大到小排序,而数组初值是从小到大,那该次排序的效率将达到最差,其移动的次数是:n, n-1,n-2,......3,2,1。其时间复杂度则将接近于O(N*N)。希尔排序就是将数组中的值均匀的分散,使其先达到基本有序,然后再对其整体进行插入排序。