直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
排序思想:
有一组数据待排序,排序区间为Array[0]~Array[n-1]。将数据分为有序数据和无序数据,第一次排序时默认Array[0]为有序数据,Array[1]~Array[n-1]为无序数据。
遍历无序区间的所有元素,每次取无序区间的第一个元素Array[i],将其和有序区间的元素进行比较,将Array[i]插入到有序区间的合适位置。
时间复杂度:O(n^2);
稳定性:稳定。
#include<stdio.h>
#include<stdlib.h>
int *Array; /*Array是一个地址,指向数组的首地址。*/
int Count; /*Count用来存储所要排序的数字的数目。*/
/*建立未排序数组*/
void CreateArray()
{
int i;
/*创建数组必须用常量分配,而我们事先并不知道要处理的数据个数,所以用malloc动态分配数组单元。*/
Array = (int *)malloc(sizeof(int)*Count);
for (i = 0; i < Count; i++)
{
printf("Please enter an integer of NO.%d to sort:\n",i+1);
scanf("%d",&Array[i]);
}
}
/*输出已排序数组*/
void Print()
{
int i;
for (i = 0; i < Count; i++)
{
printf(" %d ",Array[i]);
}
printf("\n");
}
/*直接插入排序升序*/
void StraightInsertSortup()
{
int i,j,x;
for (i = 1; i < Count; i++)
{
x = Array[i];
/*升序排序*/
for (j = i - 1; j > -1 && Array[j] > x; j--)
{
Array[j+1] = Array[j];
}
Array[j+1] = x;
}
}
/*直接插入排序降序*/
void StraightInsertSortdown()
{
int i,j,x;
for (i = 1; i < Count; i++)
{
x = Array[i];
/*降序排序*/
for (j = i - 1; j > -1 && Array[j] < x; j--)
{
Array[j+1] = Array[j];
}
Array[j+1] = x;
}
}
int main(void)
{
int i;
printf("Please enter the number of Numbers to sort:\n ");
scanf("%d",&Count);
CreateArray(); /*创建数组用来存储将要排序的数。*/
StraightInsertSortup(); /*直接插入排序升序排列*/
printf("升序排列\n");
Print(); /*打印已排序数组*/
StraightInsertSortdown(); /*直接插入排序降序排列*/
printf("降序排列\n");
Print(); /*打印已排序数组*/
return 0;
}