1、选择排序
- 当n个数存储在a[1]~a[n]中时,选择排序的代码如下:
for(i=1;i<=n-1;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
注1:外循环可以理解为选数,第1轮选第1个数即a[1],第i轮选第i个数即a[i],第n-1轮选第n-1个数,即外循环for(i=1;i<=n-1;i++)。
注2:对于外循环选择的第i个数,将与这个数后面所有数进行比较,也就是说,内循环的第1轮选第i+1个数与a[i]进行比较,最后1轮选第n个数与a[i]比较,即内循环for(j=i+1;j<=n;j++)。
完整的代码和结果如下:
#include "stdio.h"
int main()
{
int i, j, k, n, a[50], t;
printf("\nInput the number of integers to sort:");
scanf("%d", &n);
printf("\nPlease input each integer:");
for(i=1; i<=n; i++)
scanf("%d", &a[i]);
for(i=1;i<=n-1;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
printf("\nThe sorted integers:");
for(i=1; i<=n;i++)
printf("%d ", a[i]);
return 0;
}
- 当n个数存储在a[0]~a[n-1]中时,选择排序的代码如下:
for(i=0;i<=n-2;i++)
{
for(j=i+1;j<=n-1;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
注1:外循环可以理解为选数,第1轮选第1个数即a[0],第n-1轮选第n-1个数即a[n-2],即外循环for(i=0;i<=n-2;i++)。
注2:对于外循环选择的a[i],将与这个数后面所有数进行比较,也就是说,内循环的第1轮选a[i+1]与a[i]进行比较,最后1轮选最后一个数即a[n-1]与a[i]比较,即内循环for(j=i+1;j<=n-1;j++)。
完整的代码和结果如下:
#include "stdio.h"
int main()
{
int i, j, k, n, a[50], t;
printf("\nInput the number of integers to sort:");
scanf("%d", &n);
printf("\nPlease input each integer:");
for(i=0; i<=n-1; i++)
scanf("%d", &a[i]);
for(i=0;i<=n-2;i++)
{
for(j=i+1;j<=n-1;j++)
{
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
printf("\nThe sorted integers:");
for(i=0; i<=n-1;i++)
printf("%d ", a[i]);
return 0;
}
2、冒泡排序
- 当n个数存储在a[1]~a[n]中时,冒泡排序的代码如下:
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
注1:外循环可以理解为轮次,对于n个数,冒泡排序的轮次为n-1轮,即外循环for(i=1;i<=n-1;i++)。
注2:内循环的第1轮是n个数从头至尾进行相邻比较,第2轮是前n-1个数从头至尾进行相邻比较,第n-1轮前两个数进行相邻比较,也就是j的范围是第1个数~倒数第2个数,要不然要相邻比较的a[j+1]就越界了,即内循环for(j=1;j<=n-i;j++)。其实,这个边界很容易确定:第一,j=1是否为第1个数;第二,把i的起始值代入j=n-i,看j=n-i是否为倒数第2个数。
完整的代码和结果如下:
#include "stdio.h"
int main()
{
int i, j, k, n, a[50], t;
printf("\nInput the number of integers to sort:");
scanf("%d", &n);
printf("\nPlease input each integer:");
for(i=1; i<=n; i++)
scanf("%d", &a[i]);
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n-i;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("\nThe sorted integers:");
for(i=1; i<=n;i++)
printf("%d ", a[i]);
return 0;
}
- 当n个数存储在a[0]~a[n-1]中时,冒泡排序的代码如下:
for(i=1;i<=n-1;i++)
{
for(j=0;j<=n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
注:由于外循环只是循环轮次,所以只需要修改内循环边界,使之符合上面所述第1个数和倒数第2个数的判定规则即可. 其中,j=0是第1个数,把i=1代入j=n-i-1得到j=n-2是倒数第2个数。
完整的代码和结果如下:
#include "stdio.h"
int main()
{
int i, j, k, n, a[50], t;
printf("\nInput the number of integers to sort:");
scanf("%d", &n);
printf("\nPlease input each integer:");
for(i=0; i<=n-1; i++)
scanf("%d", &a[i]);
for(i=1;i<=n-1;i++)
{
for(j=0;j<=n-i-1;j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
printf("\nThe sorted integers:");
for(i=0; i<=n-1;i++)
printf("%d ", a[i]);
return 0;
}