插入排序:有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
算法步骤:
(1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
(2)从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
代码如下:
//1、插入排序
#include<stdio.h>
#include<stdlib.h>
//#include<string.h>
//#include<assert.h>
void insert_sort(int *arr, int len)
{
int i = 0;
int j = 0;
int temp = 0;
for (i = 1; i < len; i++)
{
temp = arr[i];//从待插入组取出第一个元素
j = i-1;//i-1即为有序组最后一个元素(与待插入元素相邻)的下标
while (j >= 0 && arr[j] > temp) //j>=0对其进行边界限制。第二个为插入判断条件
{
arr[j+1] = arr[j];//若不是合适位置,有序组元素向后移动
j--;
}
arr[j+1] = temp;//找到合适位置,将元素插入
}
}
int main()
{
int i = 0;
int arr[] = { 9,5,6,7,4,1,2,3 };
int sz = sizeof(arr) / sizeof(arr[0]);
insert_sort(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d\n", arr[i]);
}
system("pause");
return 0;
}
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。以上就是插入排序的简单实现,部分注释已在代码中给出,有不足的地方欢迎大家批评指正!