(个人理解,学习自用)
一、原理
1,将第一个数和后面所有数进行比较。
2,如果大小不是我们需要的顺序就交换他们的位置。
3,将1,2循环进行直至排序正确。
二、理解
如图,这一串数字(i,j,k,都代表数组角标),我们用三个变量来标记他们,i是每一轮开始被比较的数(也是每一轮最小数放置的位置)。j用来遍历后续数字和i作比较。k作为一个中间变量,作用是记住j遍历的数中最小的那位数(k需要和i从同一位置开始,因为i有可能就是这一轮的最小值)。每一轮将当轮的最小值k与最小值需要被放置的位置i做交换,重复,直至完成排序。
#include <stdio.h>
int a[10] = {3,24,5,8,1,66,2,9,4,0};
int main() {
int i,j,t;
for (i = 0;i<10;i++) {
int k = i;//K为中间变量,用来记住循环中比所比较数更小的数。
for (j = i+1;j<10;j++) {
//每次排序后将当轮最小值换到前面,所以j只需从已排过序的后一位进行寻找。
if (a[j]<a[k])
k = j; //若被比较的数更小就将K更新,保证K为最小值。
t = a[i], a[i]=a[k], a[k]=t;
}
}
for (i = 0;i<10;i++)//将排好序的一串数输出
printf ("%d ",a[i]);
return 0;
}
参考b站up Cukor丘克
三、例题
#include <stdio.h>
int a[100];
int main() {
int i,j,k,t,n;
scanf ("%d",&n);
for (i = 0;i<n;i++)
scanf ("%d",&a[i]);
for (i = 0;i<n-1;i++) {
k = i;//将i的值赋给k,用作计比要排序的数小的数
for (j = i+1;j<n;j++)
if (a[j]<a[k]) {
k = j;
}
t = a[k];a[k]=a[i];a[i]=t;
//交换的步骤需要写在if外,因为需要输出的是交换一步的结果
printf ("step %d: ",i+1);
for (j = 0;j<n;j++) {
//这里变量字母不能为i,因为这里还在i的循环里,需要用别的字母
//而j在上个循环已经结束可以使用不会影响,也可以再定义一个新字母
printf ("%d ",a[j]);
}
puts ("");
}
printf ("sorted array: ");
for (i = 0;i<n;i++)
printf ("%d ",a[i]);
return 0;
}
注意:
if,for都默认控制一条语句