插入排序基本思想
将第0个元素看作是一个有序序列,然后依次从第1个元素开始逐个插入到这个有序序列当中,执行次就是有序序列了。
平均时间复杂度
最好时间复杂度
(当原数组序列正好已经有序了,只需要比较
次就可以了)
最坏时间复杂度
(当原数组序列是逆序的,需要比较
次)
特性
具有稳定性(相同元素的相对位置不会改变)
//插入排序
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
void insertSort(int a[],int n)
{
for(int i=1;i<n;i++)//第0个是有序的,从第1个开始插入
{
int tmp = a[i]; //记录
for(int j= i-1;j>=0;j--)//倒着从第i-1个开始判断
{
if(tmp < a[j]){
a[j+1]=a[j];//比tmp大的都向后移动
if(j==0){
a[j]=tmp;//注意:如果全部都比tmp大,到了数组头部就要直接插入了
break;
}
}
else {
a[j+1] = tmp;//找到了比插入值大的元素就插入
break;
}
}
}
}
void insertSort2(int a[],int n){
for(int i=1;i<n;i++){
int j;
int elem = a[i];
for(j=i-1;j>=0&&elem<a[j];j--){//换成大于就是从大到小排列了
//从第i-1个开始判断,只要没到数组头部且比插入值小,就向后移动
a[j+1]=a[j];
}
a[j+1]=elem;//只要到了数组头部,或者找到了比插入值大的元素,就插入
}
}
int main(void)
{
int n = 10;
int arr[10] = {0};
for(int i=0;i<n;i++)
{
arr[i]=rand()%100;
}
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
insertSort2(arr,10);
for(int i=0;i<n;i++)
{
cout<<arr[i]<<" ";
}
return 0;
}