【预告】
这几次将讲讲排序(从简单开始),废话不多说,直接切入正题
【关于插入排序】
【定义】
定义:插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
【时间复杂度】
最好情况(也就是一开始就是有序的):O(N)
最坏情况:O(N^2)
【原理】
设arr[]={5,2,1,4,6},将它从小到大排序
次数/数组元素 | 1 | 2 | 3 | 4 | 5 |
1(插入5) | 5 | ||||
2(插入2,与5比较大小,2<5, 2插入在5前面) | 2 | 5 | |||
3(插入1,与2比较大小,1<2, 1插入在2、5前面) | 1 | 2 | 5 | ||
4(插入4,与1、2、5分别比较大小, 1<2<4<5,4插入在5前面) | 1 | 2 | 4 | 5 | |
5(插入6,与1、2、4、5分别比较大小, 1<2<4<5<6,6放在5后面) | 1 | 2 | 4 | 5 | 6 |
【实现插入排序】
1、初始化:设数组的第一个元素是一个已经排序的序列。
2、从未排序的序列中取出一个元素:从第二个元素开始,依次取后面的元素。
3、在已排序的序列中找到该元素的位置:将取出的元素与已排序序列中的元素进行比较,从后往前找第一个比它大的元素。
4、插入元素:将找到的位置后面的元素后移一个位置,为新元素腾出空间,然后将新元素插入到这个位置。
5、重复步骤2-4:直到所有元素都被插入到已排序序列中。
【代码实现】
【第一种:非递归写法】
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=2;i<=n;i++){
int j;
int k=a[i];
for(j=i-1;j>0;j--){
if(a[j]>k){
a[j+1]=a[j];
}
else{
break;
}
}
a[j+1]=k;
}
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}
【第二种:递归写法】
#include<bits/stdc++.h>
using namespace std;
int a[25];
void Sort(int a[],int num){
if(num==1){
return;
}
Sort(a,num-1);
int tmp=a[num],i;
for(i=num-1;i>=1;i--){
if(a[i]>tmp){
a[i+1]=a[i];
}
else{
break;
}
}
a[i+1]=tmp;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
Sort(a,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
都看到这里了,就不能给个小红心吗❤❤❤
标签:int,插入排序,元素,C++,插入,num,序列,排序 From: https://blog.csdn.net/mrx_888888/article/details/140643071