4.插入排序
4.1插入排序的思想和复杂度
插入排序思想
插入排序每次扫描的元素个数递增一个,且将最小的插入到最前面,然后将其余数字向后移动。直到逐个扫描到最后一个元素。
时间和空间复杂度
时间复杂度如表所示
算法 | 平均情况 | 最好情况 | 最差情况 |
---|---|---|---|
冒泡 | O(N^2) | O(N) | O(N^2) |
空间复杂度:O(1)
4.2插入排序操作
假设有这样一个数组vec:
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|---|
数组 | 4 | 3 | 5 | 2 | 1 | 9 | 8 | 6 | 0 | 7 |
插入排序同样以外层循环和内层循环的逻辑来分析,内层循环的目的是找到当前轮次中最小的值,然后将其插入到最前面,其余数字原模原样地向后移动。内层循环遍历的顺序是从右到左。
外层循环的目的是依次递增扫描的窗长,每次都增加扫描一个数。
内层循环(0
i=3的内层循环:
指针
i
更新数组
3
4
5
2
1
9
8
6
0
7
指针
j
i
更新数组
3
4
5
2
1
9
8
6
0
7
指针
j
i
更新数组
3
4
5
2
1
9
8
6
0
7
指针
j
i
更新数组
3
4
5
2
1
9
8
6
0
7
指针
i&j
更新数组
2
3
4
5
1
9
8
6
0
7
外层循环(1<=i
可以通过下表理解外层循环的交换:
指针
i
原始数组
0
4
3
5
2
1
9
8
6
7
指针
i
原始数组
0
1
4
3
5
2
9
8
6
7
指针
i
原始数组
0
1
2
4
3
5
9
8
6
7
指针
i
原始数组
0
1
2
3
4
5
9
8
6
7
...
指针
i
更新数组
0
1
2
3
4
5
6
7
8
9
OK, 可以上代码了。
4.3 C++代码
#include
#include
using namespace std;
class Sort
{
public:
void insert(vector &vec)
{
int number=vec.size();
vector nullvec;
if(number==0)return;
for(int i=1;i0;j--)
{
if(vec[j] &vec)
{
for(int i=0;i init()
{
vector vec;
int arr[10]={4,3,5,2,1,9,8,6,0,7};
vec.insert(vec.begin(),arr,arr+10);
cout <<"ori:"< &vec)
{
for(int i=0;ivec[i+1])return false;
}
return true;
}
private:
void exch(vector &vec,int a,int b)
{
int tmp;
tmp=vec[a];
vec[a]=vec[b];
vec[b]=tmp;
}
};
int main()
{
Sort sortob;
vector mvec=sortob.init();
sortob.insert(mvec);
cout <<"------result-------"<
输出结果:
i=3的内层循环:
指针 | i | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
更新数组 | 3 | 4 | 5 | 2 | 1 | 9 | 8 | 6 | 0 | 7 | |
指针 | j | i | |||||||||
更新数组 | 3 | 4 | 5 | 2 | 1 | 9 | 8 | 6 | 0 | 7 | |
指针 | j | i | |||||||||
更新数组 | 3 | 4 | 5 | 2 | 1 | 9 | 8 | 6 | 0 | 7 | |
指针 | j | i | |||||||||
更新数组 | 3 | 4 | 5 | 2 | 1 | 9 | 8 | 6 | 0 | 7 | |
指针 | i&j | ||||||||||
更新数组 | 2 | 3 | 4 | 5 | 1 | 9 | 8 | 6 | 0 | 7 |
外层循环(1<=i
可以通过下表理解外层循环的交换:
指针
i
原始数组
0
4
3
5
2
1
9
8
6
7
指针
i
原始数组
0
1
4
3
5
2
9
8
6
7
指针
i
原始数组
0
1
2
4
3
5
9
8
6
7
指针
i
原始数组
0
1
2
3
4
5
9
8
6
7
...
指针
i
更新数组
0
1
2
3
4
5
6
7
8
9
OK, 可以上代码了。
4.3 C++代码
#include
#include
using namespace std;
class Sort
{
public:
void insert(vector &vec)
{
int number=vec.size();
vector nullvec;
if(number==0)return;
for(int i=1;i0;j--)
{
if(vec[j] &vec)
{
for(int i=0;i init()
{
vector vec;
int arr[10]={4,3,5,2,1,9,8,6,0,7};
vec.insert(vec.begin(),arr,arr+10);
cout <<"ori:"< &vec)
{
for(int i=0;ivec[i+1])return false;
}
return true;
}
private:
void exch(vector &vec,int a,int b)
{
int tmp;
tmp=vec[a];
vec[a]=vec[b];
vec[b]=tmp;
}
};
int main()
{
Sort sortob;
vector mvec=sortob.init();
sortob.insert(mvec);
cout <<"------result-------"<
输出结果:
可以通过下表理解外层循环的交换:
指针 | i | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
原始数组 | 0 | 4 | 3 | 5 | 2 | 1 | 9 | 8 | 6 | 7 |
指针 | i | |||||||||
原始数组 | 0 | 1 | 4 | 3 | 5 | 2 | 9 | 8 | 6 | 7 |
指针 | i | |||||||||
原始数组 | 0 | 1 | 2 | 4 | 3 | 5 | 9 | 8 | 6 | 7 |
指针 | i | |||||||||
原始数组 | 0 | 1 | 2 | 3 | 4 | 5 | 9 | 8 | 6 | 7 |
... | ||||||||||
指针 | i | |||||||||
更新数组 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
OK, 可以上代码了。
4.3 C++代码
#include
#include
using namespace std;
class Sort
{
public:
void insert(vector &vec)
{
int number=vec.size();
vector nullvec;
if(number==0)return;
for(int i=1;i0;j--)
{
if(vec[j] &vec)
{
for(int i=0;i init()
{
vector vec;
int arr[10]={4,3,5,2,1,9,8,6,0,7};
vec.insert(vec.begin(),arr,arr+10);
cout <<"ori:"< &vec)
{
for(int i=0;ivec[i+1])return false;
}
return true;
}
private:
void exch(vector &vec,int a,int b)
{
int tmp;
tmp=vec[a];
vec[a]=vec[b];
vec[b]=tmp;
}
};
int main()
{
Sort sortob;
vector mvec=sortob.init();
sortob.insert(mvec);
cout <<"------result-------"<
输出结果: