下面从两大方面来介绍两种语言的不同和优劣。
冒泡排序
Const n As Integer = 100 "类似于c语言中的int类型的常量
Dim i As Integer, j As Integer
Dim Arr(1 To n) As Integer "arr是一个长度为n的数组,VB中运用上下界控制数组长度
" 这里给Arr数组随机赋值,代码略.
"注意,在VB中通过控件输入的值都是字符类型(该类型在c语言中直接没有,可以用字符串数组来代替),需要将他们通过val函数转变成(数值)。同理输出是需要用str函数把数值在转变成字符。
For i = 1 To n - 1 " 这是外循环, 控制遍历检查的趟数, 这里走 N - 1 遍
For j = 1 To n - i " 这是内循环, 控制每趟检查的次数, 这里走 N - i 遍, 因为上一次的状态下已经有 i 个数排好了, 还有 N - i + 1 个数需要被检查
If Arr(j) > Arr(j + 1) Then " 这是负责检查的If语句,它的运行的次数也就是上文提到的执行次数
Swap(Arr(j), Arr(j + 1)) " 交换,它运行的次数是上文提到的交换次数
End If
Next j
Next i
"Next End 为判断和循环结束的标志
Sub Swap(X1 As Integer,X2 As Integer)"同样需要对函数传入参数,格式也类似
X1 = X1 - X2
X2 = X2 + X1
X1 = X2 - X1
End Sub " 采用加减法交换的 过程(Sub) , 暂且可以理解为没有返回值的交换函数(Function)
" 此冒泡运行时,总是将最大的数字往后丢
"也可以用function自定义函数写,类似c语言中自己写的函数
选择排序
Const n As Integer = 100
Dim i As Integer , j As Integer, max As Integer
Dim Arr(1 To n) As Integer
" 这里给Arr数组随机赋值,代码略.
For i = 1 To n - 1
max = i " 定义了一个变量max,用来标志本次循环最大的数. 首先默认置为当前位, 即 i
For j = i + 1 To n
If Arr(j) > Arr(max) Then
max = j " 如果发现有个数比下标为max的元素大时, max下标就该指向那个数, 也就是赋值它的下标
End If
Next j
If max <> i Then
Swap(Arr(i),Arr(max)) " 当max不等于原下标时, 说明最大值是另一个数, 交换
End If
Next i
Sub Swap(X1 As Integer,X2 As Integer)
X1 = X1 - X2
X2 = X2 + X1
X1 = X2 - X1
End Sub
" 该选择运行会把大的数往后丢
了解过c语言的很明显就能看出在For循环和If判断语句中,两种语言有异曲同工之妙。
冒泡排序
#include
int main(void)
{
int n,i,t,tmp;
scanf("%d", &n);
int a[10];
for (i = 0;i < n;i++) {
scanf("%d", &a[i]);
}
int m = n-1;
for (i = 0;i < n ;i++) {//做n遍
for (t = 0;t < m;t++) {//每一遍都会搜索到m-1项
if (a[t] > a[t + 1]) {
tmp = a[t];
a[t] = a[t + 1];
a[t + 1] = tmp;
} //前一项和后一项进行比较,递增
}
}
for (i = 0;i < n;i++) {
printf("%d ", a[i]);
}
}
选择排序
#include
int main(void)
{
int a[10];
int n,i,min,t,tmp;
scanf("%d", &n);
for (i = 0;i < n;i++) {
scanf("%d", &a[i]);
}
for (i = 0;i < n-1;i++) {
min = i;//把每轮无序区的第一个设定成最小值
for (t = i + 1;t < n;t++) {
if (a[t] < a[min])
min = t;//所有数和最小值比较,更小则把当前的t放入min中
}
if (a[i] != min) {
tmp = a[i];
a[i] = a[min];
a[min] = tmp;//一遍后把最小值放到有序区的末尾
}
}
for (i = 0;i < n;i++) {
printf("%d ", a[i]);
}
}
VB
1. key的赋值已在前文代码中提到,运用了val函数。而后面的Text1.Text则是控件的类别和名称。
2. 对分查找便是在一串数据中以最快的方法找到key这个数。
3. 对于本题感兴趣的也可以研究一下,出自浙江2021年一月选考技术。
c语言
#include
int main()
{
int key ;//要在数组中寻找的数
int i,n;//n为该数组的长度
scanf("%d %d",&n, &key);
int arr[10];
for (i = 0;i < n;i++) {
scanf("%d", &arr[i]);
}
int length = sizeof(arr) / sizeof(arr[0]);//数组的长度
int low = 0;
int high = length - 1;
while (low <= high)
{
int mid = (low + high) / 2;//对分查找每次从中间mid开始
if (arr[mid] > key)
{
high = mid - 1;
}
else if (arr[mid] < key)
{
low = mid + 1;
}
else
{
printf("找到了");
break;
}
}
if (low > high)
printf("没在数组中找到该数");
return 0;
}