A,直接插入排序:排序过程中,整个序列被分成两部分,前一部分有序,后一部分无序。每次从无序表中取出一个元素,然后把它插入到有序表中的合适位置,使有序表保持有序,直到无需表部分元素个数为0,排序结束。
B,算法原理:
1)假设数组序列依次为a1,a2,.....,an;
2)第一趟比较a1和a2,时前两个元素升序排序,第二趟比较a1,a2,a3,使前三个元素升序排序;
3)每次新元素i插入到前i-1个已经有序的元素中时,依次与i-1,i-2,...,1位置的元素比较,并插入到对应次序位置;
4)以此类推,直到使前n个元素有序,排序结束。
下图为一组乱序序列直接插入排序的过程:
C,算法实现:
#include ”iostream”
usingnamespace std;
intmain()
{
void sort(int[], int);
int array[] = {5,3,11,7,1,8,12,14,9};
int n = sizeof(array)/sizeof(int*);
sort(array, n);
for(int i = 0; i < n; ++i)
cout<<array[i]<<" ";
cout<<endl;
return 0;
}
//直接插入排序
//array表示测试元素序列,n为序列元素个数
voidsort(int array[], int n)
{
int temp,index;
for(int i = 1; i < n; ++i)
{
temp = array[i];
index = i;
//找到元素插入的位置
for(int j = i - 1; j >= 0; --j)
{
if(array[index] < array[j])
index = j;
else break;
}
//将插入位置之后的元素后移一个位置
for(int k = i; k > index; --k)
array[k] = array[k-1];
array[index] = temp;
}
}
运行结果:
D,复杂度分析
(a)时间复杂度:
1)如果序列初始为升序排序,则无需移动,只需比较n-1次即可完成排序,因此最好的时移动次数复杂度
为O(n),移动次数复杂度为O(1);
2)如果序列初始为降序排序,则最坏需要比较1+2+3+...+(n-1)=n(n-1)/2次,最坏需要移动1+2+...+
(n-1)=n(n-1)/2次,因此比较的最坏时间复杂度为O(n^2),移动的最坏时间复杂度为O(n^2);
3)综上所述,比较的平均时间复杂度为O(n^2),移动的平均时间复杂度为O(n^2)。
(b)空间复杂度:程序中定义了temp和index两个变量,因此空间复杂度为O(1)。