原题链接:[编程入门]选择排序
冒泡排序可以使用第一次循环排序将最大值放在最后
例如:
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分
23 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
冒泡排序讲解那里交换值是不是有点问题? int t=arr[j]; arr[j]=arr[j+1]; arr[j+1]=arr[j]; 最后不是应该把t的值赋给arr[j+1]吗?