C语言编程,求众数

C语言编程,求众数,第1张

int

a[n],A[n]

不能这样定义行镇的吧。。。

A[a[i]]++

这句有问题!

若输入的哗带握a[i]大于n,则超出了A的下标范围

访问乱庆数组超范围的下标,就会Runtime

Error。。。

数组排序可以不用指针。你把数组定义成全局变量族败,比如说a[10001]然后调用我给你的快排程序就行了,这个程序可以背下来,很有用的。

void

qs(int

L,int

R)

{

int

i=L,j=R,mid=a[(L+R)/2],t

while(i<j)

{

while(a[i]<mid)

++i

while(a[j]>mid)

--j

if(i<=j)

{

t=a[i]

a[i]=a[j]

a[j]=t

++i

--j

}

}

if(i<R)

qs(i,R)

if(L<j)

qs(L,j)

}

排好序之后找中位数就好办了。

至于众数,我觉得最好的方法是用bfs。但这个对你来说难度有点大,我就给你写一个hash表吧。誉穗侍还用上面的那个数组,且假定数组a中的最大值不超过10000,若超过,你把下面这个hash数组的范围扩大就行了。

另外,设a中有n个元素,a从1开始计数(若从0开始,你改一下就好了)

int

hash[10001]={0}

int

i,Max=0

for(i=1

i<=n

++i)

{

++hash[a[i]]

if(hash[a[i]]>hash[Max])

Max=a[i]

}

最后输出Max就好了

刚t415422663倒是提醒我了,如果要判断众数有多个,我可以把上面的程序稍改一下

int

hash[10001]={0}

int

i,Max=-1/*注意,这里庆吵把Max赋值为-1是为了防止数组a的元素个数为0时所有数据都被输出*/

for(i=1

i<=n

++i)

{

++hash[a[i]]

if(hash[a[i]]>Max])

Max=hash[a[i]]

}

//10000是数组a中可能出现的最大值,这个你可以自己改的

for(i=1

i<=10000

++i)

if(hash[i]==Max)

printf("%d\n",i)

Option Explicit

Private Sub Form_Load() '所有的数据以空格间隔输入在text中,注意最后一个数字输入好后还要输入空格的

Text1 = "11 22 1 3 3 4 5 6 5 44 3 2 3 4 5 6 7 8 6 5 4 3 2 2 1 1 1 1 2 3 4 4 5 5 6 6 7"

Text1 = Text1 &"4 5 6 7 8 9 9 9 9 9 8 7 6 5 5 4 3 3 3 "

End Sub

Private Sub Command1_Click()

Dim A, i As Integer, flag As Boolean

Dim Temp() As String, N() As Integer, j As Integer, k As Integer

Dim max As Integer, B() As Integer '这里是用来求众数的,也就是出现最多次数的,因为众数可以不为一个,我这里就用数组表示了

A = Split(Text1, " ")

ReDim Temp(1)

ReDim N(1)

Temp(1) = A(0)

j = 1

For i = 0 To UBound(A) - 1

For k = 1 To j

If A(i) = Temp(k) Then

N(k) = N(k) + 1

flag = True

Exit For

End If

Next

If flag Then

flag = False

Else

j = j + 1

ReDim Preserve Temp(j)

ReDim Preserve N(j)

Temp(j) = A(i)

N(j) = 1

End If

Next

For i = 1 To j'这个循冲旦环可以显示出所有数出现的次数,可以用来检验

Print Temp(i) &"出现了" &N(i) &"次"

Next

ReDim B(1) '这个循环是为了求出出现最多的数,因散则扰为有多个众数所以用盯旦这个方法了

max = N(1)

k = 1

B(1) = 1

For i = 1 To j

If max <N(i) Then

max = N(i)

ReDim B(1)

B(1) = i

k = 1

ElseIf max = N(i) Then

k = k + 1

ReDim Preserve B(k)

B(k) = i

End If

Next

Print

Print "众数是:"

For i = 1 To k

Print Temp(B(i))

Next

End Sub


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12452929.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存