排序算法三:插入排序
**有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。**
插入排序代码:
/*****************************************************
File name:3insert_pai_xu.c
Author: Tang Zhiqian
Date:2017-08-07 18:45
*****************************************************/
// 直接插入排序
#include <stdio.h>
#define MAX 10
void print(int arr[]);
void insert(int arr[]);
int main()
{
int arr[MAX] = {5,0,1,6,2,7,3,8,4,9};
int arr1[MAX] = {0,1,2,3,4,5,6,7,9,8};
insert(arr);
print(arr);
printf("\n\n");
insert(arr1);
print(arr1);
return 0;
}
void print(int arr[])
{
int i;
for (i = 0; i < MAX; i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
void insert(int arr[])
{
int i,j,temp;
for (i = 1; i < MAX; i++) //从1开始,往第0个数排序
{
temp = arr[i];
if (arr[i - 1] > arr[i]) //如果第i - 1个数大于第i个数,则进行插入操作
{
j = i - 1;
while(arr[j] > temp && j >= 0)
{
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = temp;
print(arr);
}
}
}
程序运行结果:
在这里我定义了两个数组,arr是乱序的,而arr1是基本有序的,两个数组的运行结果可以看到,第一个数组排序打印了6行,第二个打印了2行。这说明插入排序适合给基本有序的数进行排序,越有序则移动插入的次数越少。