H2330819027


私信TA

用户名:dotcpp0701405

访问量:9829

签 名:

指向函数指针数组的指针int(*(*p[4]))(int int)

等  级
排  名 125
经  验 7649
参赛次数 1
文章发表 79
年  龄 18
在职情况 学生
学  校 Hzu university
专  业 软件工程

  自我简介:

TA的其他文章


冒泡排序可以使用第一次循环排序将最大值放在最后

例如:

       1 3 2 6 8 5 7 9 4

1和3比较不交换位置 ,3和2比较后交换位置,以此类推。

 第一次循环排序后为

       1 2 3 6 5 7 8 4 9  

第二次循环排序后为

       1 2 3 5 6 7 4 8 9

假如有十个元素,冒泡排序如下

冒泡排序
#include int main() {
    int arr[10] = {5, 2, 9, 1, 5, 6, 3, 8, 7, 4};
    int i = 0;
    int j = 0;
    
    for (i = 0; i < 9; i++) { // 外层为循环排序次数,为n-1次
        for (j = 0; j < 10 - 1 - i; j++) { // 10-1为数组下标,-i表示循环后排在最后的元素不需要比较
            if (arr[j] > arr[j + 1]) {
                int t = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = t;
            }
        }
    }
    
    for (i = 0; i < 10; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}


假如有十个元素,另一种冒泡排序也可以归结为简单的选择排序:

第一个元素和后面的元素逐一进行比较,大的数和小的数交换位置,把最小的数放在前面。

以此类推。

第二个元素和后面的元素逐一进行比较


{
    int arr[10];
    int i=0;
    int j=0;
    for(i=0;i<9;i++)//外层循环表示循环次数,为n-1次
    {
        for(j=i+1;j<10;j++)//内层的判断条件表示每次都要与最后一个元素比较
        {
            if(arr[i]>arr[j])
            {
                int t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
        }
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",arr[i]);
    }
return 0;
}

由以上,我们可以通过找到最小元素的下标,来降低交换次数。

我的理解是

首先定义一个整形变量min,用来存储数组中最小数值的下标

默认数组第一位元素为min下标

使用for循环和if判断更小的元素,找到则把该元素的下标赋予min(而不是在这里就互换两个元素的位置,不然这和冒泡有什么区别呢)

直到找到最小的元素下标,最后将第一个元素与min记录的最小元素互换位置

往后依此类推

此题的选择排序如下:

#include int main() {
    int arr[10]; // 声明一个包含10个整数的数组
    int i = 0;
    int j = 0;
    int min; // 用于存储最小元素的下标

    // 从用户输入读取10个整数并存储到数组中
    for (i = 0; i < 10; i++) {
        scanf("%d", &arr[i]);
    }

    // 使用选择排序算法对数组进行升序排序
    for (i = 0; i < 9; i++) {
        min = i; // 假设当前元素是最小的

        // 在剩余的元素中查找更小的元素
        for (j = i + 1; j < 10; j++) {
            if (arr[j] < arr[min]) {
                min = j; // 更新最小元素的下标
            }
        }

        // 如果找到了比当前元素更小的元素,交换它们
        if (min != i) { // 说明i不是最小元素
            int t = arr[min];
            arr[min] = arr[i];
            arr[i] = t;
        }
    }

    // 打印排序后的数组
    for (i = 0; i < 10; i++) {
        printf("%d\n", arr[i]);
    }

    return 0;
}


 

0.0分

19 人评分

  评论区

#include<stdio.h>
int main()
{
    int a[10];
    for(int i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<9;i++){
        for(int j=0;j<10-1-i;j++){
            if(a[j]>a[j+1]){
                int x=a[j];
                a[j]=a[j+1];
                a[j+1]=x;
            }
        }
    }
    for(int i=0;i<10;i++){
        printf("%d\n",a[i]);
    }
    return 0;
}
2024-03-04 15:45:46
大家帮忙看看这个哪里有问题
#include <stdio.h>
void swap(int &a,int &b)
{
	int t = 0;
	t = a;
	a = b;
	b = t;
}
int main()
{
	int arr[10] = { 0 };
	scanf("%d %d %d %d %d %d %d %d %d %d",arr);
	int n = 10;
	while (n)
	{
		for (int i = 0; i <= 8; i++)
		{
			if (arr[i] >= arr[i + 1])
				swap(arr[i], arr[i + 1]);
		}
		n--;
	}
	printf("%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d", arr[0], arr[1], arr[2], arr[3], arr[4], arr[5], arr[6], arr[7], arr[8], arr[9]);
	return 0;
}
2024-01-20 13:50:42
校友 写得很好
2023-12-24 18:10:19
校友 写得很好
2023-12-24 18:10:06
大佬们帮忙看看这个为什么不对
#include <stdio.h>
int main()
{
	int a[10];
	for(int i=0;i<10;i++)
	{
		scanf("%d",&a[i]);
	}
	int count;
	while(count){
		count=0;
		for(int j=0;j<9;j++)
		{
			if(a[j]>a[j+1])
			{
				count++;
				int temp=a[j];
				a[j]=a[j+1];
				a[j+1]=temp;
			}
		}
	}
	for(int t=0;t<10;t++)
	{
		printf("%d",a[t]);
		for(int n=0;n<9;n++)
		{
			if(n==t)
			printf("\n");
		}
	}
    return 0;
}
2023-12-20 10:28:46
很好
2023-12-12 20:36:03
第二种冒泡排序那里是不是应该是 int t=arr[i];
                                                    arr[i]=arr[j];
                                                    arr[j]=t;  才对啊,还是我没理解完全呢?
2023-12-05 17:14:05
冒泡排序讲解那里交换值是不是有点问题?
int t=arr[j];
         arr[j]=arr[j+1];
                arr[j+1]=arr[j];
最后不是应该把t的值赋给arr[j+1]吗?
2023-11-28 17:20:06