插入排序概述
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为⊙(㎡)。是稳定的排序方法。
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为⊙(㎡)。是稳定的排序方法。
插入算法(insertion sort)把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外,而第二部分就只包含这一个元素。在第一部分排序后,再把这个最后元素插入到此刻已是有序的第一部分里的正确位置中。
#include <stdio.h>
#include <stdlib.h>
void output(int a[], int n);
int main()
{
int a[100] = {0};
int n = 0, i = 0, k = 0, j = 0;
char x;
printf("请向容器中输入从小到大的数\n");
while(scanf("%d", &a[i]) == 1){
k++, i++;
if (k == 100){
printf("容器已满,不能继续插入.\n");
exit(-1);
}
}
output(a, k);
fflush(stdin);
while(k <= 100){
printf("输入你想插入的数:");
fflush(stdin);
scanf("%d", &n); //插入排序
if (a[i-1] < n){ //如果当前的数比容器中最后的数大
a[i++] = n; //直接插在容器的最后面
k++; //容器的个数加1
}else{
for (j = i-1; j >= 0; j--){ //查找将要插入的合适的位置
if (a[j] > n){ //如果当前的数比插入的数大
a[j+1] = a[j]; //容器的数位置后移
}else{
break; //当前的数比插入的数要小
}
}
a[j+1] = n; //则插入到当前位置i+1的位置
k++;
i++;
}
output(a, k);
if (k == 100){
printf("容器已满,不能继续插入。\n");
exit(-1);
}
printf("是否继续插入,Y | N: ");
fflush(stdin);
scanf("%c", &x);
if (x == 'N' || x == 'n')
break;
}
return 0;
}
void output(int a[], int n){
int i = 0;
for(; i < n; i++)
printf("%d ", a[i]);
printf("\n");
}