当前位置: 首页 > news >正文

网站想做个链接怎么做百度app官网下载安装

网站想做个链接怎么做,百度app官网下载安装,网站开发一般会用到什么语言,武汉室内设计公司排名文章目录 选择冒泡插入排序归并排序希尔排序 经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考这篇 C语言实现各种排序算法[选择&#x…

文章目录

    • 选择冒泡
    • 插入排序
    • 归并排序
    • 希尔排序

经常看到这种算法可视化的图片,但往往做不到和画图的人心灵相通,所以想自己画一下,本文主要实现归并排序和希尔排序,如果想实现其他算法可参考这篇

C语言实现各种排序算法[选择,冒泡,插入,归并,希尔,快排,堆排序,计数]

选择冒泡

这两种排序方案简单到很难说是什么算法,其中选择排序通过遍历一次数组,选出其中最大(小)的值放在新数组的第一位,再从剩下的数里选出最大(小)的,放到第二位,依次类推;冒泡排序则是通过重复走访要排序的数组,比较相邻元素,如果顺序不符合要求则交换位置,直到不需要交换为止。

选择排序冒泡排序
在这里插入图片描述在这里插入图片描述

二者的核心代码分别为:

#x为待排序列表,N=len(x)
#选择排序
for i in range(N):iMax = ifor j in range(i, N):if(x[j]>x[iMax]):iMax = jx[iMax],x[i] = x[i],x[iMax]#冒泡排序
tempN = N-1
for i in range(tempN):for j in range(0, tempN-i):if(x[j]>x[j+1]):x[j],x[j+1] = x[j+1],x[j]

下面给出选择排序的绘图代码,其他的所有排序算法,其实只需改变核心部分。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation start,end,N = 10,100,9
x = np.random.randint(start, end, size=N)
Index = np.arange(N)
xs = []
nowIndex = []for i in range(N):iMax = ifor j in range(i, N):xs.append(x*1)      #存储当前顺序,用于绘图nowIndex.append([i,j,iMax]) #存储当前的i,j,max位置,用于绘图if(x[j]>x[iMax]):iMax = jxs.append(x*1)nowIndex.append([i,j,iMax])x[iMax],x[i] = x[i],x[iMax]fig, ax = plt.subplots()
colors = np.repeat('g',N)
colors[0] = 'b'
bar = ax.bar(Index,x,color=colors)def animate(n):data = xs[n]colors = np.repeat('gray',N)colors[nowIndex[n]] = 'b','g','r'ax.clear()bar = ax.bar(Index, data, color=colors)return barani = animation.FuncAnimation(fig, animate, range(len(xs)), interval=500, repeat=False, blit=True)
plt.show()
ani.save("sort.gif")

插入排序

插入排序的基本思路是将数组分为前后两个部分,前面有序,后面无序。逐个扫描无序数组,将每次扫描的数插入到有序数组中,从而有序数组越来越长,无序数组越来越短,直到整个数组都是有序的。

核心代码为

for i in range(1,N):j = i-1temp = x[i]while(x[i]<x[j] and j>=0):x[j+1] = x[j]j -= 1x[j+1] = temp

由于在这段代码中, x i x_i xi被取出放在旁边,所以其动态图中大部分时间会缺失一个值,在图中将其置于最右侧,其动态过程如图所示,蓝色表示抽出来准备插进去的那根bar

在这里插入图片描述

归并排序

排序算法到这里才算有点意思,归并排序是算法导论中介绍分治概念时提到的,基本思路是将数组拆分成子数组,然后令子数组有序,再令数组之间有序,从而整个数组有序。

算法步骤 \textbf{算法步骤} 算法步骤

设数组有 n n n个元素, { a 0 , a 1 , … , a n } \{a_0,a_1,\ldots,a_n\} {a0,a1,,an}

  1. 如果数组元素大于2,则将数组分成左数组和右数组,如果数组等于2,则将数组转成有序数组
  2. 对左数组和右数组执行1操作。
  3. 合并左数组和右数组。

可以发现,对长度为 n n n的数组,需要 log ⁡ 2 n \log_2n log2n次的拆分,每个拆分层级都有 O ( n ) O(n) O(n)的时间复杂度和 O ( n ) O(n) O(n)的空间复杂度,所以其时间复杂度和空间复杂度分别为 O ( n log ⁡ 2 n ) 和 O ( n ) O(n\log_2n)和O(n) O(nlog2n)O(n)

其核心算法为

def Merge(X, Y):nL,nR = len(X), len(Y)iterL,iterR = 0,0xNew = []for _ in range(nL+nR):if(iterL==nL): return xNew + Y[iterR:]if(iterR==nR): return xNew + X[iterL:]if(X[iterL]<Y[iterR]):xNew.append(X[iterL])iterL += 1else:xNew.append(Y[iterR])iterR += 1return xNewdef MergeSort(x):if len(x)==1:return xif len(x)==2:return x if x[0]<x[1] else [x[1],x[0]]nL = len(x)//2return Merge(MergeSort(x[:nL]),MergeSort(x[nL:]))

当然这么写效率是非常低的,如果像高效还是得用指针,但我都已经用Python了,所以就不去想效率的问题,问题的关键是这种带有返回值的递归程序根本没法画图啊。。。所以还是改成指针的写法

def Merge(X, nL):nR = len(X)-nLXL,XR = X[:nL]*1,X[nL:]*1iterL,iterR = 0,0for i in range(nL+nR):if(iterL==nL): breakif(iterR==nR): X[i:] = XL[iterL:]returnif(XL[iterL]<XR[iterR]):X[i] = XL[iterL]iterL += 1else:X[i] = XR[iterR]iterR += 1def MergeSort(X):if len(X)<2:returnnL = len(X)//2MergeSort(X[:nL])MergeSort(X[nL:])Merge(X,nL)

这个图。。怎么说呢,因为在【Merge】过程中,有很多bar被掩盖掉了,所以可能只有画图的人能看懂吧。。。

在这里插入图片描述

希尔排序

据说是第一个突破 O ( n 2 ) O(n^2) O(n2)的排序算法,又称为缩小增量排序,本质上也是一种分治方案。

在归并排序中,先将长度为n的数组划分为nL和nR两部分,然后继续划分,直到每个数组的长度不大于2,再对每个不大于2的数组进行排序。这样,每个子数组内部有序而整体无序,然后将有序的数组进行回溯重组,直到重新变成长度为n的数组为止。

希尔排序反其道而行之,在将数组划分为nL和nR后,对nL和nR进行按位排序,使得nL和nR内部无序,但整体有序。然后再将数组进行细分,当数组长度变成1的时候,内部也就谈不上无序了,而所有长度为1的数组整体有序,也就是说有这些子数组所组成的数组是有序的。

算法步骤 \textbf{算法步骤} 算法步骤

设数组有 n n n个元素, { a 0 , a 1 , … , a n } \{a_0,a_1,\ldots,a_n\} {a0,a1,,an}

  1. 如果数组元素大于2,则将数组分成左数组和右数组,并对左数组和右数组的元素进行一对一地排序。
  2. 对每一个数组进行细分,然后将每个子数组进行一对一排序。
def ShellSort(arr):n = len(arr)nSub = n//2while nSub>0:for i in range(nSub,n):temp = arr[i]j = i-nSubwhile j>=0 and temp<arr[j]:arr[j+nSub] = arr[j]j -= nSubarr[j+nSub] = tempnSub //= 2

在这里插入图片描述

http://www.yidumall.com/news/13961.html

相关文章:

  • 长滚动页网站怎么做seo关键词排名优化推荐
  • 如何快速优化网站排名网络seo关键词优化技术
  • 石河子网站建设公司农产品网络营销方案
  • 张家港做网站的推荐大数据查询平台
  • 优化网站的软件网站seo诊断分析
  • 南阳专业网站建设seo公司官网
  • 传统网站设计的缺点seo关键词推广案例
  • 网站建设的建议数据分析软件
  • 温州网站建设优化百度提问
  • 行业网站建设方案个人免费开发网站
  • 网站策划书怎么做的美观广州日新增51万人
  • 全屏网站帮助百度论坛首页官网
  • 绵阳做网站哪家公司好专业的google推广公司
  • 什么网站可以做问卷调查亚马逊市场营销案例分析
  • WordPress 有趣插件长沙seo推广
  • 西安广告设计制作公司培训班线上优化
  • 南昌网站seo技术厂家中国十大企业培训机构排名
  • 网站建设加优化快速seo优化
  • 时尚 wordpress百度seo在哪里
  • 有人在相亲网站骗人做传销股票发行ipo和seo是什么意思
  • 免费下载模板的网站好口碑关键词优化地址
  • 网站开发页面怎么进自助建站系统个人网站
  • 怎样才可以知道网站是否优化宁波seo快速优化教程
  • 山西成宁做的网站百度关键词搜索量排名
  • 门户网站网页设计规范手机网站关键词seo
  • 做app原型的网站站长工具名称查网站
  • 通过网站做诈骗立案吗app推广注册赚钱
  • wap网站建设方案 pdf百度管理员联系方式
  • web网站开发能使用c 吗路由优化大师
  • 北京集团 网站建设上海优化关键词的公司