直接插入排序,使用C语言实现。
这里为了方便测试面对大量数据时直接插入排序算法的运行时间,通过宏定义来设定生成随机数的数量(即参与排序的数据数量),利用rand()函数生成随机数,便于生成大量数据,并且通过srand()函数保证每次编译运行生成的随机数不同,使用
代码中,使用arr[0]临时存放待排序的那个元素(即判断是否要插入的那个数), 从arr[1]开始存放随机数。
实现代码代码实现如下:
#include运行示例:#include //生成随机数rand() #include //用到clock()函数计时 ,利用srand()设置随机数种子 #define N 10000 //宏定义,定义生成随机数的数量 //直接插入排序 void InsertionSort(int* A, int n) { int key; //待排序的数(要插入的数) int i, j; for (j = 2; j <= n; j++) { key = A[j]; i = j - 1; while (i > 0 && A[i] > key) { A[i + 1] = A[i]; //大于key,向右移 i--; } A[i + 1] = key; //小于key,在其后插入key } } int main() { int* arr = (int*)malloc(sizeof(int) * N); int i; clock_t startTime, endTime;//该时间计算以ms为单位 printf("生成的随机数如下:n"); srand((unsigned)time(NULL)); //设置随机数种子 (此处以时间作为参数,因为每次生成随机数的时间不同,每次生成的随机数也就不同) for (i = 1; i <= N; i++) { //arr[0]临时存放要插入的数 arr[i] = rand() % 10000000 + 10; //生成10~10000010间的随机数,从arr[1]开始存放随机数 printf("%d ", arr[i]); } printf("n排序后的数如下:n"); startTime = clock(); //计时开始 InsertionSort(arr, N); //调用排序函数,生成有序数组 endTime = clock(); //计时结束 for (i = 1; i <= N; i++) printf("%d ", arr[i]); //计算运行时间 printf("n直接插入排序-Running Time:%dn", endTime - startTime); }
最好情况——顺序输入
顺序排列时,需比较(n-1)次——时间复杂度为:
最坏情况 ——逆序输入
需比较n(n-1)/2次——时间复杂度为:
平均情况——时间复杂度为:
空间复杂度分析直接插入排序过程需要一个临时空间存储待排序元素,这里的arr[0]用来储存待排序元素,因此,空间复杂度为:
算法稳定性插入排序是一种稳定的排序算法。


![直接插入排序(C语言)[测试数据随机生成+计算程序运行时间+算法效率分析] 直接插入排序(C语言)[测试数据随机生成+计算程序运行时间+算法效率分析]](http://www.mshxw.com/aiimages/31/835499.png)
