写法1
#define _CRT_SECURE_NO_WARNINGS
#define N 10
#include<stdio.h>
int main()
{
int arr[N] = { 3,1,7,5,8,9,0,2,4,6 };
int i = 1;
for (i = 1; i <= N - 1; i++)
{
int j = i;
for (j = 1; j <= N - i; j++) //在第一趟中,有9次交换,N-i = 9
{ //而且还需要比较 arr[j] = arr[9]的时候
if (arr[j - 1] < arr[j]) //所以这种情况下 循环条件不能写成j<=N-i-1 , 应该写成j<=N-i
{ //这种情况容易出错 因为写成j=0开始的话 是j<N-i-1
int tmp = arr[j]; //然后我们可能想当然的以为 j=1开始不就是把 <换成<=吗
arr[j] = arr[j - 1]; //因为以前的写法是 n次可以写成 j=0 ;j<n j=1;j<=n
arr[j - 1] = tmp;
} //其实并不是 因为在外部循环中 i是从1开始的 相比于i从0开始 我们的j就要少减去一个1
} //所以要写成j<=N-i
}
for (i = 0; i <= N - 1; i++) //而且还不能写成arr[j]<arr[j+1] 因为j从1开始 arr[0]也要参与比较
printf("%d ", arr[i]);
return 0;
}
写法2
#define _CRT_SECURE_NO_WARNINGS
#define N 10
#include<stdio.h>
int main()//总之要写就写一种写法,混着写,容易错
{
int arr[N] = { 3,1,7,5,8,9,0,2,4,6 };
int i = 0;
for (i = 0; i < N - 1; i++)
{
int j = i;
for (j = 0; j < N - i - 1; j++)
{
// 这里不能写成这样 因为在第一趟中 j刚开始是0 arr[j-1]==arr[-1] 数组越界
// if (arr[j - 1] < arr[j])
// {
// int tmp = arr[j];
// arr[j] = arr[j - 1];
// arr[j - 1] = tmp;
// }
//
if (arr[j] < arr[j+1])
{
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
for (i = 0; i <= N - 1; i++)
printf("%d ", arr[i]);
return 0;
}