请问怎么用数组解决范围较大的数的比较问题?
比如以下实例:
假设有50张卡片,每张卡片上都印有其编号(1~50)。
现在这些卡片的次序被打乱了,需要你将其重新按照升序排序。
用冒泡排序啊
#include <stdio.h>
int main()
{
int card[50],i,j,t;
for(i=0;i<50;i++)
scanf("%d",&card[i]);
for(i=0;i<49;i++)
for(j=0;j<49-i;j++)
{
if(card[j] > card[j+1])
{
t = card[j];
card[j] = card[j+1];
card[j+1] = t;
}
}
for(i=0;i<50;i++)
printf("%d ",card[i]);
}
一维数组的排序 可以看看排序算法的知识 例如:冒泡排序 选择排序********很多的
#include <stdio.h>
#define CARD_NUM 50
void selection_sort(int card[], int n);
int main() {
int cards[CARD_NUM] = {22, 3, 46, 12, 35, 17, 29, 48, 44, 1, 39, 27, 18, 10, 45, 9, 31, 26, 32, 4, 40, 47, 16, 14, 30, 11, 25, 42, 2, 28, 7, 21, 23, 20, 43, 6, 8, 36, 38, 33, 41, 5, 15, 19, 49, 24, 50, 34, 13, 37};
int i;
printf("排序前的卡片:\n");
for (i = 0; i < CARD_NUM; i++) {
printf("%d ", cards[i]);
}
printf("\n");
selection_sort(cards, CARD_NUM);
printf("排序后的卡片:\n");
for (i = 0; i < CARD_NUM; i++) {
printf("%d ", cards[i]);
}
printf("\n");
return 0;
}
void selection_sort(int card[], int n) {
int i, j;
int min_index, tmp;
for (i = 0; i < n - 1; i++) {
min_index = i;
for (j = i + 1; j < n; j++) {
if (card[j] < card[min_index]) {
min_index = j;
}
}
if (min_index != i) {
tmp = card[i];
card[i] = card[min_index];
card[min_index] = tmp;
}
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:例如 你定义
#define mul(a,b) a*b
就像下面输出结果是41而不是66
int main()
{
int a=5,b=6;
int c=mul(a+b,b);
printf("%d\n",c);
}
mul(a+b,b)并不是按(a+b)*b 而是 a+b*b输出结果 并没有运算规则 他是完整的把a+b 传递给了a 其实说成没有运算规则不严谨 只是没有按照我们给他的设想去计算,它比较死,一股脑传递过去 自然成了a+b*b
#define mul(a,b) (a)*(b)
结果自然是66
对于比较问题,可以使用C语言的数组算法来进行解决。其中,冒泡排序和快速排序是比较常用的算法之一。
冒泡排序就是把大的元素往后移,小的元素往前移,每一次比较都交换相邻两个元素的位置,从而实现对整个数组的排序。具体来说,就是对数组中相邻两个元素进行比较,并交换其位置,每一轮比较结束后会将未排序的最大元素移到当前未排序部分的最后。
下面是冒泡排序的代码实现:
void bubble_sort(int arr[], int len) {
int i, j, temp;
for (i = 0; i < len - 1; i++) { //两两比较,较大的排后面
for (j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
快速排序则是在数组中选择一个元素作为基准,并将数组分为两个子序列,其中一个子序列中的所有元素都小于等于基准,而另一个子序列中的所有元素都大于基准,然后对这两个子序列分别进行递归排序。
下面是快速排序的代码实现:
void quick_sort(int a[], int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right, key = a[left];
while (i < j) {
while (i < j && a[j] >= key) {
j--;
}
if (i < j) {
a[i++] = a[j];
}
while (i < j && a[i] < key) {
i++;
}
if (i < j) {
a[j--] = a[i];
}
}
a[i] = key;
quick_sort(a, left, i - 1);
quick_sort(a, i + 1, right);
}
对于50张卡片按编号升序排序的问题,可以先将卡片编号存储在一个数组中,然后使用以上两种算法中的一种对数组进行排序,最终得到升序排序后的数组。
下面是一个使用冒泡排序进行50张卡片按编号升序排序的示例代码:
#include <stdio.h>
void bubble_sort(int arr[], int len);
int main() {
int arr[50] = { 42, 1, 9, 23, 6, 13, 18, 7, 37, 2, 33, 21, 22, 43, 49, 29,
24, 5, 14, 47, 50, 3, 46, 16, 15, 10, 38, 31, 36, 44, 32, 28, 39,
11, 35, 34, 48, 27, 45, 41, 30, 17, 40, 4, 8, 19, 12, 25, 20, 26 };
bubble_sort(arr, 50);
for (int i = 0; i < 50; i++)
printf("%d ", arr[i]);
return 0;
}
void bubble_sort(int arr[], int len) {
int i, j, temp;
for (i = 0; i < len - 1; i++) { //两两比较,较大的排后面
for (j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
输出结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50