经典排序算法–直接插入排序
直接插入排序
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,
算法适用于少量数据的排序,时间复杂度O(n^2)。是稳定的排序方法。
插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。
加下来我们讲解一下最简单的插入排序:直接插入排序
我们从图中可以看到我将i代表有序数组的尾部,j代表无序数组的首部,如果j的值小于i的值,则用tmp来保存i的值;反之,则j++
大概就是这个过程,学习编程最重要的就是思维,希望大家指正
下面给出代码以供大家理解:
#include <stdio.h>
#include <assert.h>
#include <iostream>
using namespace std;
/*
直接插入排序
就是把数组分割成为两个数组
一个为有序数组
一个为无序数组
*/
//打印函数
void Print(int arr[],int len)
{
int i=0;
for(i;i<len;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
//直接插入排序
void InsertSort(int arr[],int len)
{
int j=1;//无序列的首部
int i=j-1;//有序列的尾部
//开辟栈空间保存结点
int tmp=0;
//遍历待排序部分
for(j=1;j<len;j++)
{
//将待排序的数值保存
int tmp=arr[j];
//遍历排序数组中值
for(i=j-1;i>=0&&arr[i]>tmp;i--)
{
arr[i+1]=arr[i];
}
arr[i+1]=tmp;
}
}
int main()
{
int arr[]={3,1,7,5,2,4,9,6};
int len=sizeof(arr)/sizeof(int);
Print(arr,len);
InsertSort(arr,len);
Print(arr,len);
return 0;
}
元素集合越接近有序,直接插入排序算法的时间效率越高
最优情况下:时间效率为O(n)
最差情况下:时间复杂度为O(n2)
平均时间复杂度为O(n2)
空间复杂度:O(1)
稳定性:稳定