时间复杂度&&空间复杂度&&选择排序&&冒泡排序&&插入排序
时间复杂度
概念
在一个算法上花费的时间
计算方法
- 忽略常量,如果运行时间是常数量级,则用1表示
- 忽略低次幂
- 忽略高次幂系数
让我们来看几个例子
1.常数算法O(1)
int sumr=0;
2.线性算法O(N)
//输出一个数组中的所有元素
for (int k = 0; k <lengt ; ++k) {
printf("%d\t",array[k]);
}
3.O(n^2)
//冒泡排序算法
for (int j = 0; j <10 ; ++j) {
for (int i = j; i <10 ; ++i) {
if(array[i]<array[i+1])
swp(array[i],array[i+1]);//交换两个值的自定义函数
}
}
- 折半查找O(logN)
//求1到10的累加和
int i = 0;
int sum=0;
while(i<=n){
sum+=i;
}
额外空间复杂度
除去样本量外还需要都少额外辅助空间,这个空间即为额外空间复杂度
冒泡排序(BubbleSort)
时间复杂度O(n^2)
#include<iostream>
using namespace std;
void swap(int Array[],int i,int j){
int temp=Array[i];
Array[i]=Array[j];
Array[j]=temp;
}
void BubbleSort(int Array[],int lenght){
if (lenght<2){
return ;
}else{
for(int i=0;i<lenght-1;i++){
for(int j=0;j<i;j++){
if(Array[j]<Array[j+1]){
swap(Array,j,j+1);
}
}
}
}
}
int main(){
int Array[]={12,34,1,5};
int lenght=sizeof(Array)/sizeof(int);
BubbleSort(Array,lenght);
for(int i=0;i<4;i++){
printf("%d\t",Array[i]);
}
}
选择排序(SelectSort)
时间复杂度O(n^2)
#include<iostream>
using namespace std;
void swap(int Array[],int i,int j){
int temp=Array[i];
Array[i]=Array[j];
Array[j]=temp;
}
void SelectSort(int Array[],int lenght){
if (lenght<2){
return ;
}else{
for(int i=0;i<lenght-1;i++){
for(int j=i+1;j<lenght;j++){
if(Array[i]<Array[j]){
swap(Array,i,j);
}
}
}
}
}
int main(){
int Array[]={12,34,1,5};
int lenght=sizeof(Array)/sizeof(int);
SelectSort(Array,lenght);
for(int i=0;i<4;i++){
printf("%d\t",Array[i]);
}
}
插入排序(InsertionSort)
跟数据状况有关
最好情况:有序=》O(N)
最差情况:逆序=》O(N^2)
平均情况:O(n^2)(最差情况下的指标)
#include<iostream>
using namespace std;
void swap(int Array[],int i,int j){
int temp=Array[i];
Array[i]=Array[j];
Array[j]=temp;
}
void InsertionSort(int Array[],int lenght){
if (lenght<2){
return ;
}else{
for(int i=1;i<lenght;i++){
for(int j=i-1; j>=0 && Array[j]<Array[j+1];j--){
swap(Array,j,j+1);
}
}
}
}
int main(){
int Array[]={12,34,1,5};
int lenght=sizeof(Array)/sizeof(int);
InsertionSort(Array,lenght);
for(int i=0;i<4;i++){
printf("%d\t",Array[i]);
}
}