每次将一个待排序的元素按其关键字大小插入到已排好的序列中,直到全部插入完毕
直接插入排序:适用于链表,顺序表
折半插入排序:只适用于顺序表
性能:最好O(n),最坏O(n^2)
稳定性:稳定
插入排序
void InsertSort(int A[], int n) //表与表长
{
int i, j, temp, i1;
for (i = 1; i < 8; i++)//元素从下表0开始,共比较n-1趟
{//升序
for (j = i; j > 0; j--)
{
if (A[j] < A[j - 1]) //如果后者小于前者
{
temp = A[j];
A[j] = A[j - 1];
A[j - 1] = temp;//前后交换
}
}
printf("第%d趟排序的序列为:", i);
for (i1 = 0; i1 < 8; i1++)
{
printf("%d ", A[i1]);
}
printf("\n");
}
}
首先指向第二个元素,为了与第一个元素相比较。若小于第一个元素,则将它与第一个元素互换。第二次循环,指向第三个元素,将第三个元素作为内层循环的最后一个元素,并且依次与前面的元素相比,若小于前面的某一个元素,则互换,并且从互换的位置,继续向前对比,直到表头为止。可以是升序也可以是降序。
全部代码
#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)
void InsertSort(int A[], int n) //表与表长
{
int i, j, temp, i1;
for (i = 1; i < 8; i++)//元素从下表0开始,共比较n-1趟
{//升序
for (j = i; j > 0; j--)
{
if (A[j] < A[j - 1]) //如果后者小于前者
{
temp = A[j];
A[j] = A[j - 1];
A[j - 1] = temp;//前后交换
}
}
printf("第%d趟排序的序列为:", i);
for (i1 = 0; i1 < 8; i1++)
{
printf("%d ", A[i1]);
}
printf("\n");
}
}
int main()
{
int A[8] = { 49,38,65,97,76,13,27,49 };
int n = 8;
printf("开始排序:\n");
InsertSort(A, n);
printf("插入排序的最终序列是");
for(int i=0;i<8;i++)
{
printf("%d ", A[i]);
}
}
钦此