插入排序:
问题:给定一个无序数组,要求进行排序(从小到大)
思路:1.首先先将数组分为两种一种是有序区一种是无序区,每次从无序区取出一个元素,插入到有序区适当位置
2.取出的无序区元素与有序区的最后一个元素比较
如果这个元素小于有序区元素那么有序区元素向后移一位,并且继续向前遍历有序区元素,arr[j+1]=arr[j];
如果出现这个元素大于有序区元素那么这个元素放在有序区元素后一位vec[j+1]=tmp;"这里的tmp指的是无序区取出的元素",
如果遇到有序区元素遍历越界了那么将这个元素放在有序区首位
3.开始时有序区是一个数即数组第一个数,无序区则是剩余n-1个数,每遍历一次,有序区元素个数增加一个,无序区元素减少一个重复n-1次,完成排序
主要代码如下(C++):
void straightSort(vector<int> &vec,int len)
{
int temp;//无序区第一个元素
for(int i=1;i<len;i++)
{
temp=vec[i];
for(int j=i-1;j>=0 && vec[j]>temp;j--)
{
vec[j+1]=vec[j];//有序区元素后移一位
}
vec[j+1]=temp;
}
}
空间复杂度:O(1)
时间复杂度:
1.平均O(N^2)//两次for循环
2.最优O(N)
3.最差O(N^2)//两次for循环
稳定性:稳定
原因:相等的两个元素,排序后,相对位置不会出现变化。