(纯手打,如有不对评论区指出)
1、冒泡排序
冒泡就像水中的泡泡一样,如果你是升序那么就把最大的泡泡浮出水面。
#include<stdio.h>
int main()//冒泡排序升序序从后往前
{
int t,i,j,a[]= {23,34,21,43,54,56,43,32,43,54};
for(i=1; i<=9; i++)
{
for(j=9; j>=i-1; j--)
{
if(a[j]<a[j-1])
{
t=a[j];
a[j]=a[j-1];
a[j-1]=t;
}
}
}
for(i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}
#include<stdio.h>
int main()//冒泡排序升序序从前往后
{
int t,i,j,a[]= {23,34,21,43,54,56,43,32,43,54};
for(i=1; i<=9; i++)
{
for(j=0; j<=10-i-1; j++)
{
if(a[j]>a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}
2、选择排序
选择排序就是确定第一个数是最小的,然后判断剩余的数有没有比他还小的,如果有则交换。
#include<stdio.h>
int main()//选择排序升序从前往后
{
int t,i,min,j,a[]= {23,34,21,43,54,56,43,32,43,54};
for(i=0; i<9; i++)
{
min=i;
for(j=i+1; j<10; j++)
{
if(a[j]<a[min])
min=j;
}
if(min!=i)
{
t=a[i];
a[i]=a[min];
a[min]=t;
}
}
for(i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}
#include<stdio.h>
int main()//选择排序升序从后往前
{
int t,i,max,j,a[]= {23,34,21,43,54,56,43,32,43,54};
for(i=9; i>0; i--)
{
max=i;
for(j=i-1; j>=0; j--)
{
if(a[j]>a[max])
max=j;
}
if(max!=i)
{
t=a[i];
a[i]=a[max];
a[max]=t;
}
}
for(i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}
3、插入排序
插入排序可以看成线性操作,那么数组都是满的怎么进行移动插入呢?这时候就需要一个变量把数组中的一个数放入这个变量,那么数组就可以空出来一个位置进行移动。
#include<stdio.h>
int main()//插入排序升序
{
int t,i,j,a[]= {23,34,21,43,54,56,43,32,43,54};
for(i=1;i<=9;i++)
{
t=a[i];//这里可以把a[i]当成空的了
for(j=i-1;j>=0&&t<a[j];j--)//如果前面的数比你要插入的数大,那么就把这个数后移
{
a[j+1]=a[j];//当前数组下标j是与要插入的数比较的数,把这个数后移
}
a[j+1]=t;//执行插入,把这句话与for循环里的a[j+1]=a[j];联系到一起,先把比自己大的数往后移动然后再插入
//至于为什么用j+1是因为把比自己大的数往后移了后要执行一次j--
//可以特殊一下循环结束的条件有可能是j<0,所以需要j++
}
for(i=0; i<10; i++)
printf("%d ",a[i]);
return 0;
}
如果实在不太理解就一步步调试看变量
不想调试的可以看下面的图片
(图片来源:https://www.cnblogs.com/chengxiao/p/6103002.html)