目录
插入排序
思路:
原理视频:
代码:
时间复杂度:
总结:
题目链接:
插入排序
题目描述:
插入排序基本思想是每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。
输入N个整数,将它们从小到大排队后输出
输入格式:
第一行输入一个整数N
第二行输入N个整数ai
输出格式:
输出N个数
样例输入:
5 1 4 2 3 5
样例输出:
1 2 3 4 5
约定:
1<=N<=1000,0<=ai<=109
思路:
插入排序(英语:Insertion sort)是一种简单直观的排序算法。它的工作原理为将待排列元素划分为“已排序”和“未排序”两部分,每次从“未排序的”元素中选择一个插入到“已排序的”元素中的正确位置。与插入排序类似的例子就像是打牌,每拿到一张牌,就将其插入到正确的位置。
插入排序是一种稳定的排序算法。
插入排序的最优时间复杂度为n,在数列几乎有序时效率很高。 插入排序的最坏时间复杂度和平均时间复杂度都为n平方级别。
原理视频:
代码:
#include<bits/stdc++.h>
using namespace std;
void Sort(int *a,int len){ //排序函数
int t,i,j;
for(i=1;i<len;i++){ //循环插入
t=a[i];
for(j=i-1;j>=0&&a[j]>t;j--) //找到插入位置
a[j+1]=a[j]; //将插入位置空出来, 也就是将这之后每一个数往后移一位
a[j+1]=t; //赋值
}
return ;
}
void print(const int *a,int n){ //输出一个数组
for(int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++) //循环输入
cin>>a[i];
Sort(a,n); //排序
print(a,n); //输出这个数组
return 0;
}
时间复杂度:
循环插入是O(N)的复杂度,在这之中还有一个找到插入位置的for循环,时间复杂度是O(logN),两者一相乘就是总时间复杂度.
总时间复杂度:O(NlogN);
总结:
这道题就是专门考的排序算法,简单插入排序,个人建议:不会桶排序,快速排序,归并排序的同学们,尽量不要用冒泡排序,这个插入排序还是更好一些,毕竟时间复杂度还是要快一些,虽然代码实现困难一点儿.
题目链接:
https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=1230&pattern=0https://www.xinyoudui.com/contest?courses=336&books=325&pages=8575&fragments=16340&problemId=1230&pattern=0