#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是不知道哪冒出来的

现在可以分析算法了,以快速排序为例子
最好情况下:均衡分治(为什么最好?别问我,看结果就知道,基于比较的比较次数都是W(nlog2(n))(证明见算法导论,利用决策树))
T(n)=2T(n/2)+ O(n)
主定理情况2
所以最好T= O(nlog2(n))
注意O被O包含
最坏情况下:最不均衡分治(为什么?不知道)
T(n)=T(1)+T(n-1)+ O(n)
T=n^2
次次都最不均衡则每次快排执行n步只确定一个元素的位置,确定n个需要n^2次

希尔排序选择排序时间复杂度分析相关推荐

  1. 随机选择算法时间复杂度分析

    随机选择算法时间复杂度分析 首先提供算法的伪代码: 算法是递归算法 时间复杂度分析思路:计算每一次递归语句所消耗的时间,再求和. 为了分析需要,我们先定义如下的量: 定义状态j:数组长度在[(3/4) ...

  2. 七大排序算法—图文详解(插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序)

    作者:渴望力量的土狗 博客主页:渴望力量的土狗的博客主页 专栏:数据结构与算法 工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器--牛客网 点击免费注册和我一起刷题吧 目录 插入排序: ...

  3. 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航: 1. 稳定性 2 . 插入排序 3. 希尔排序 4. 选择排序 5. 堆排序 6 冒泡排序 1. 稳定性 两个相等的数据,如果经过排序后,排序算法能保证其相对位置不发生变化,则我们称该算法 ...

  4. 数据结构:直接插入排序 希尔排序 选择排序 堆排序 冒泡排序 快速排序 归并排序

    一.什么是排序 排序就是将一组杂乱无章的数据按照一定的次序组织起来,此次序可以是升序也可以是降序 二.为什么需要进行排序 为了满足一些需求,比如在比较学生的成绩时,我们就需要给所有学生的成绩排一个顺序 ...

  5. c++ java 选择排序,选择排序(示例代码)

    简述 选择排序的基本思想是:每一趟从待排序列中选取关键字最小的元素,作为有序序列的一个新的元素,直到待排序列只剩下一个元素,则完成排序.主要算法有简单选择排序和堆排序. 简单选择排序 算法思想 假设序 ...

  6. 看动画学算法之:排序-选择排序

    文章目录 简介 选择排序的例子 选择排序的java代码实现 选择排序的第二种java实现 选择排序的时间复杂度 简介 选择排序就是从数组中选择出来最大或者最小的元素,然后将其和队首或者队尾的元素进行交 ...

  7. php冒泡和选择排序,选择排序vs冒泡排序

    冒泡排序: 稳定算法,发挥的也很稳定,最小时间复杂度n,最差复杂度为 n^2,使用两层循环实现,依次将数组里的每个元素,与其他元素比较,只要大于当前正在比的元素就交换两者 代码实现:function  ...

  8. 算法-排序-选择排序

    选择排序 特点:原址排序,比较排序,时间复杂度O(n^2) // // Created by 许加权 on 2021/6/19. //#include <iostream>void sel ...

  9. 数据结构/排序/选择排序/简单选择排序

    原理 介绍: 原理:每趟排序记录最小记录的索引后交换 类比:猴子搬苞谷,喜欢更大的苞谷.猴子经过1排苞谷,每经过1个苞谷就与心中的苞谷对比,更大就记录当前苞谷的位置,走完这一排苞谷,心中的那个苞谷就是 ...

最新文章

  1. 机试记不住头文件_计算机考研机试攻略
  2. matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)
  3. 成都七中实验学校爆食品安全问题,互联网+后勤能做点什么吗?
  4. Java算法--插入排序算法
  5. 11.1 JavaScript介绍
  6. 搭建属于自己的技术博客
  7. aistudio/jupyter 相关
  8. 武汉大学linux课程,武汉大学超算中心
  9. [译] 关于CSS中的float和position (父容器div内的子元素div为float时,父元素无法撑开(或高度自适应)的解决方式)
  10. about x86 protected mode
  11. MySQL 索引分析
  12. 2020美赛回忆录|平生第一次打美赛的获奖方式......美赛准备方法和思想
  13. 服务器lsass系统错误,lsass.exe系统错误如何解决?
  14. 组装计算机的主要配置,自己组装电脑的基本配置跟一些注意事项
  15. undefined == null的正确解释
  16. 吴恩达deeplearning之CNN—人脸识别与风格化转换(2)
  17. Javafx中切换输入法
  18. 内存卡删除的视频能恢复吗?四个步骤
  19. 星巴克创始人第三次重出江湖
  20. Spring Boot概述与入门特点配置方式注入方式yim配置文件与多文件配置Spring Boot自动配置原理lombok应用

热门文章

  1. 令牌桶算法的python实现,人人都可以玩算法
  2. Pap.er 3.5.4 中文版 (专为Mac设计的高清壁纸应用)
  3. HCTF writeup(web)
  4. XMind 常用快捷键(思维导图总结)
  5. 在JS中如何获取时间以及转换时间
  6. Centos 桌面卡死解决办法,不关闭程序重启桌面
  7. 原生js实现canvas粒子特效
  8. 开放式运动耳机排行榜,排行靠前的五款高性能耳机分享
  9. 计算机显卡设置方法,显卡在哪里设置 显卡设置方法【详细介绍】
  10. 力扣-患某种疾病的患者