直接插入排序,使用C语言实现。
这里为了方便测试面对大量数据时直接插入排序算法的运行时间,通过宏定义来设定生成随机数的数量(即参与排序的数据数量),利用rand()函数生成随机数,便于生成大量数据,并且通过srand()函数保证每次编译运行生成的随机数不同,使用<time.h>中的clock()来计时。
代码中,使用arr[0]临时存放待排序的那个元素(即判断是否要插入的那个数), 从arr[1]开始存放随机数。
实现代码
代码实现如下:
#include <stdio.h>
#include <stdlib.h> //生成随机数rand()
#include<time.h> //用到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:%d\n", endTime - startTime);
}
运行示例:
时间复杂度分析
最好情况——顺序输入
顺序排列时,需比较(n-1)次——时间复杂度为:
最坏情况 ——逆序输入
需比较n(n-1)/2次——时间复杂度为:
平均情况——时间复杂度为:
空间复杂度分析
直接插入排序过程需要一个临时空间存储待排序元素,这里的arr[0]用来储存待排序元素,因此,空间复杂度为:
算法稳定性
插入排序是一种稳定的排序算法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)