排序方法(三)插入排序

使用语言:c语言,编译器visual studio 2017
一.基本思想
假设从小到大排序。从第二个数开始往后遍历,将每个数插入到前面的有序序列中,最后形成一整个有序序列。将第二个数与第一个数比较,小的放前面,可以视为第一次插入;将第三个数插入到第一第二个数形成的有序序列中,这是第二次插入;…将最后一个数插入完毕,则排序完毕。例子:将下列数排序:
56,48,10,7,0,23,10,99,90,40
排序方法(三)插入排序
二.代码实现

#include<stdio.h>
int main() {
	int array[100];
	int i = 0;
	int j = 0;
	int num = 0;
	printf("请输入待排序的数字个数:\n");
	scanf_s("%d", &num);
	printf("请输入%d个数字:\n", num);
	for (i; i<num; i++) scanf_s("%d", &array[i]);
	if (num == 1) return 0;
	if (array[0] >= array[1]) {
		int temp = array[0];
		array[0] = array[1];
		array[1] = temp;
	}
	printf("第1次插入的结果:%d %d\n", array[0], array[1]);
	if (num == 2) return 0;
	else {
		for (i = 2; i < num; i++) {
			int temp = array[i];
			for (j = i - 1; temp < array[j]; j--) {
				array[j + 1] = array[j];
				if (j == -1) break;
			}
			array[j + 1] = temp;
			printf("第%d次插入的结果:", i);
			for (int k = 0; k <= i; k++) {
				printf("%d ", array[k]);
				if (k == i) printf("\n");
			}
		}
	}
	return 0;
}

三.时间复杂度分析
(1)最好情况:序列原本就是有序的。则比较次数为n-1,时间复杂度为O(N)。
(2)最差情况:序列是逆序的。则比较次数和移动次数均为:1+2+3+4+……+n-1=(n-1)n/2,时间
复杂度为O(N^2)。
(3)平均情况:序列出现各种排列的概率相同,则比较次数和移动次数约为n^2/4,故此时时间复杂
度为O(N^2)。