冒泡排序可以使用第一次循环排序将最大值放在最后
例如:
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分
25 人评分
#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; }
大家帮忙看看这个哪里有问题 #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; }
大佬们帮忙看看这个为什么不对 #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; }
H2330819027 2023-12-20 22:22:55 |
在排序部分,你没有给 count 变量赋初始值,这将导致循环条件始终为假,排序部分的代码将不会执行。你需要将 count 的初始值设为非零值,以便进入循环。另外,你可以使用冒泡排序算法进行排序,但是循环条件中的 j < 9 应该改为 j < 10,否则最后一个元素不会被比较。
北方 2023-12-21 18:38:13 |
@dotcpp0701405 多谢,我还是个新手,操作还不太熟练
第二种冒泡排序那里是不是应该是 int t=arr[i]; arr[i]=arr[j]; arr[j]=t; 才对啊,还是我没理解完全呢?
冒泡排序讲解那里交换值是不是有点问题? int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=arr[j]; 最后不是应该把t的值赋给arr[j+1]吗?
H2330819027 2023-11-28 19:00:24 |
打错了,已经修改了
C二级辅导-计负均正 (C语言代码)浏览:605 |
母牛的故事 (C语言代码)浏览:778 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:1050 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:708 |
C语言程序设计教程(第三版)课后习题8.9 (Java代码)浏览:1399 |
A+B for Input-Output Practice (IV) (C++代码)浏览:712 |
C语言训练-亲密数 (C语言代码)浏览:695 |
简单的a+b (C语言代码)浏览:527 |
格式化数据输出 (C语言代码)浏览:882 |
C语言程序设计教程(第三版)课后习题10.5 (C语言代码)浏览:983 |