本文介绍的第一个算法是插入排序,emmm,从最简单的算法开始,慢慢踏入算法大门。
首先分析整个算法:
输入:a1,a2,a3,......,an(n个数)
输出:a1',a1',a2',a3',......,an'(a1'≤a1'≤a2'≤a3'≤......≤an')
思想:感觉和我们玩斗地主一样的感觉
在刚开始时,我们的手牌是空的,开局后,每抽到一张牌,我们把他按照顺序插在适合的位置,为了找到合适的位置,我们需要一一与底牌比较。以数组A[] = {1,3,2,6,5}为例,插入排序的过程如下:
Step 1:A[0]=1 A[] = {1,3,2,6,5};
Step 2:A[1]=3 1<3 A[] = {1,3,2,6,5};
Step 3:A[2]=2 1<2<3 A[] = {1,2,3,6,5};
Step 4:A[3]=6 3<6 A[] = {1,2,3,6,5};
Step 5:A[4]=5 3<5<6 A[] = {1,2,3,5,6}。
具体C++代码:
#include <iostream>
using namespace std;
//用于打印数组,方便查看
int printArr(int A[], int length) {
for(int i = 0; i < length; i++) {
cout<<A[i]<<" ";
}
cout<<endl;
}
//插入排序算法
void insert_sort(int A[], int length) {
cout<<"中间数组变化:"<<endl;
for(int i = 1; i < length; i++) {
for(int j = 0; j < i; j++) {
if(A[i] < A[j]) {
/*这个地方可能会疑惑为什么直接交换位置
因为j的循环未结束,接下来的循环会依次把数移到从小到大的位置*/
swap(A[i], A[j]);
}
}
printArr(A, length);
}
}
//主函数
main() {
int num[100];
int len=0;
cout<<"请输入数组:";
while (cin>>num[len]){
len++;
if (cin.get() == '\n')
break;
}
cout<<"初始数组:";
printArr(num, len);
insert_sort(num, len);
cout<<"最终数组:";
printArr(num, len);
}
代码执行结果:
接下来我们来分析这个算法:
最好情况 最差情况
比较次数 n-1 2+3+4+……+n=(n+2)n/2
移动次数 0 1+2+3+……+n-1=n*n/2
若待排序对象序列中出现各种可能排列的概率相同,则可取上述最好情况和最坏情况的平均情况。移动次数约为 n2/4。因此,直接插入排序的时间复杂度为 o(n2)。