前言:
这篇博客主要讲插入排序算法的相关内容,当然啦,相比于教科书所举出的冒泡排序,选择排序等排序方式,这个相对要难一些,不过,万变不离其中,只要你热爱算法,那就来看一下我的这篇博客吧!
题目:
给定一乱序数组,和需插入的值,请你利用编程输出一个新的数组,其元素只包括乱序数组元素和要插入的元素,且是按升序排列。
输入样例:
4
1 3 4 5
2
1 2 3 4 5
分析:
- 首先我们先把给定的乱序数组进行升序排列。
- 再则找出数组中第一个大于要插入的数的索引,再此将后面的元素右移一位,并保存在新数组中。
代码:
#include<stdio.h>
const int N=1000; //定义一个数组所能包含的元素个数
int n,a[N];
int main(){
while(scanf("%d",&n)==1){
int stack[N],top=0,i; //实现一个栈,其top表示栈顶
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
int j=1,A=1;
i=0; //j的结果会影响最后的输出结果
while(i<n){
if(A==a[i]){
A++;
i++;
}
else if(top&&stack[top]==a[i]){
top--; //top--表示栈指针-1,指向栈顶
i++;
}
else if(A<=n){
stack[++top]=A++; //++top表示栈指针加一,指向进栈
}
else{
j=0;
break;
}
}
printf("%s\n",j?"Yes":"No"); //当j=1时输出Yes,j=0时,输出No
}
return 0;
}
我认为我的注释已经够清楚了,在此我就不再详细讲解了。
算法分析:
从上述代码我们可以来看看,当我们输入的乱序数组是一个刚刚排序好的数组的话,那么上述代码,在解决该题的效率就会很高,或者说是在该代码中效率最高的一种情况,反之,当我们输入的数组是一个逆序方式的排序的话,那么上述代码在解决该题的话,就会效率极低(最低的一种情况)。上面我们所谈论的是有关于该算法的时间复杂度的分析,如果你有所了解,那么你就会大致知道最好的一种情况,其总时间是一个一次函数的表达式,其变量为执行一次所需要的时间,当然啦,最坏的一种情况为一个一元二次函数的表达式。我认为,在求取最高效率算法的过程中,应该是一种不一样的乐趣吧!
结束语:
好了,大家,这篇博客到此也结束了,同时希望对大家有所帮助。希望大家多多支持!!!😃😃😃