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 ExplicitPrivate 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 "众数是:"
For i = 1 To k
Print Temp(B(i))
Next
End Sub
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)