希尔排序选择排序时间复杂度分析
#include <stdio.h>
#include <stdlib.h>void shellsort(char array[],int len);
void selectsort(char array[],int len);void swap(char *a,char *b)
{*a ^= *b;*b ^= *a;*a ^= *b;
}//好多傻逼面试都考这种写法,岂不知这种写法在a,b是一个数时有bug:假设a=6,a=a^a=(0b110)^(0b110)=0,a=a^a=(0b000)^(0b000)=0,a=a^a=0(同上)
//或者void swap1(char *a,char *b)
{*a += *b;*b -= *a;*a -= *b;
}//a=2a;a=a;a=0 bug一样存在
//所以多写一个temp不会死,并不是什么都能优化的main()
{char c;int i=0,len=0;int test=6;char array[100];memset(array,0,100);while((c=fgetc(stdin))!=EOF)//&&c!='\n'){len++;array[i++]=c;}
// shellsort(array,len);selectsort(array,len);for(i=0;i<len;i++)fputc(array[i],stdout);//swap(&test,&test);swap1(&test,&test);printf("\n%d",test);
}void shellsort(char array[],int len)
{int gap,i,j;for(gap=len/2;gap>0;gap/=2)//3,3,4,1,4{for(i=gap;i<len;i++)//插入排序的一种简洁写法,好像是算法导论上的{for(j=i-gap;array[j+gap]<array[j]&&j>=0;j-=gap){swap(&array[j+gap],&array[j]);}}}
}
void selectsort(char array[],int len)
{int i,j,min;for(i=0;i<len;i++){min=i;for(j=i+1;j<len;j++){if(array[j]<array[min]){min=j;}}if(min!=i){swap(&array[i],&array[min]);}}
}
//选择排序时间复杂度分析:最好最坏情况最内层的循环平均执行N/2次(必须比较j和min处元素的值),外层循环执行N次,所以复杂度O(N^2)
下面说一说时间复杂度的分析方法:
这里把算法分为分治和非分治两种情况
1.非分治直接分析执行最多的代码次数,没有统一分析方法
以希尔排序为例子
这里分析原始的希尔排序,初始步长d=n/2,下一次步长d=d/2
第一次比较次数:1*n/2
第二次比较次数:最坏(1+2+3)*n/4
第三次比较次数:最坏(1+2+3+……+7)*n/8
......
2.分治有一种主定理方法
首先明确几个问题
A.f(n)=O(g(n))符号的定义:存在常量N和c,对于任意的n>N,0<=f(n)<=cg(n)
如:n^2=O(2 n^2)
说白了就是f一定是小于等于g或者大于g但是是和g同一个级别的无穷大量
若f(n)=O(g(n))则g=W(f)
B.f(n)=o(g(n))符号的定义:对于任意的c,存在常量N,对于任意的n>N,0<=f(n)<cg(n)其实这个g就是工科数学里面的相对于f的高阶无穷大
如:2n=o(n^2)
若f(n)=o(g(n))则g=w(f) (omega打不出来只能用w了,抱歉)
C.主定理:
若T(n)=aT(n/b)+f(n),即规模为n的算法所用时间可以分治为a个规模n/b的同样问题加上一个f(n)
则有以下三个结论:
c1:f==O(n^(logb(a)-e))则T=O-n^(logb(a)
c2:f==O-(n^(logb(a)))则T=O-n^(logb(a)*log2(n)
c3:f==W(n^(logb(a)+e))则T=O-f原文中后面关于f那一坨基本上都满足
f=O里面有一横(g)表示同阶无穷大,定义为存在N,c1,c2,n>N时,c1*g<=f<=c2*g,夹逼定理
ps:图中那个x是不知道哪冒出来的
希尔排序选择排序时间复杂度分析相关推荐
- 随机选择算法时间复杂度分析
随机选择算法时间复杂度分析 首先提供算法的伪代码: 算法是递归算法 时间复杂度分析思路:计算每一次递归语句所消耗的时间,再求和. 为了分析需要,我们先定义如下的量: 定义状态j:数组长度在[(3/4) ...
- 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)
作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...
- 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)
快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...
- 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序
一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...
- c++ java 选择排序,选择排序(示例代码)
简述 选择排序的基本思想是:每一趟从待排序列中选取关键字最小的元素,作为有序序列的一个新的元素,直到待排序列只剩下一个元素,则完成排序.主要算法有简单选择排序和堆排序. 简单选择排序 算法思想 假设序 ...
- 看动画学算法之:排序-选择排序
文章目录 简介 选择排序的例子 选择排序的java代码实现 选择排序的第二种java实现 选择排序的时间复杂度 简介 选择排序就是从数组中选择出来最大或者最小的元素,然后将其和队首或者队尾的元素进行交 ...
- php冒泡和选择排序,选择排序vs冒泡排序
冒泡排序: 稳定算法,发挥的也很稳定,最小时间复杂度n,最差复杂度为 n^2,使用两层循环实现,依次将数组里的每个元素,与其他元素比较,只要大于当前正在比的元素就交换两者 代码实现:function ...
- 算法-排序-选择排序
选择排序 特点:原址排序,比较排序,时间复杂度O(n^2) // // Created by 许加权 on 2021/6/19. //#include <iostream>void sel ...
- 数据结构/排序/选择排序/简单选择排序
原理 介绍: 原理:每趟排序记录最小记录的索引后交换 类比:猴子搬苞谷,喜欢更大的苞谷.猴子经过1排苞谷,每经过1个苞谷就与心中的苞谷对比,更大就记录当前苞谷的位置,走完这一排苞谷,心中的那个苞谷就是 ...
最新文章
- 机试记不住头文件_计算机考研机试攻略
- matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
- 成都七中实验学校爆食品安全问题,互联网+后勤能做点什么吗?
- Java算法--插入排序算法
- 11.1 JavaScript介绍
- 搭建属于自己的技术博客
- aistudio/jupyter 相关
- 武汉大学linux课程,武汉大学超算中心
- [译] 关于CSS中的float和position (父容器div内的子元素div为float时,父元素无法撑开(或高度自适应)的解决方式)
- about x86 protected mode
- MySQL 索引分析
- 2020美赛回忆录|平生第一次打美赛的获奖方式......美赛准备方法和思想
- 服务器lsass系统错误,lsass.exe系统错误如何解决?
- 组装计算机的主要配置,自己组装电脑的基本配置跟一些注意事项
- undefined == null的正确解释
- 吴恩达deeplearning之CNN—人脸识别与风格化转换(2)
- Javafx中切换输入法
- 内存卡删除的视频能恢复吗?四个步骤
- 星巴克创始人第三次重出江湖
- Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用