1、冒泡排序
如果是升序,就是把最大的数排到末尾,末尾下标向前移动,利用相邻数字比较大小实现把最大的数排到末尾,a[j]和a[j+1]比较大小,如果a[j+1]大则交换。这样两两交换下来,最后一个肯定最大,最后一个已经排好,下次循环不用再排,所以下标做减一操作。
#include<stdio.h>
#include<string.h>
int main(){
int a[]={1,3,5,2,3,55,44,66};
int n=sizeof(a)/sizeof(int)-1;
for(int i=n;i>0;i--){
for(int j=0;j<n;j++){
if(a[j]>a[j+1]){
int y=a[j];
a[j]=a[j+1];
a[j+1]=y;
}
}
}
//printf("%d ",sizeof(a)/sizeof(int)-1);
for(int i=0;i<=n;i++)
printf("%d ",a[i]);
}
2、选择排序
若升序,每次把最小的放在前面,在数组中找最小的,遍历一遍,记录最小值和下标,赋给a[0],然后再遍历一遍,赋给a[1],重复。
#include<stdio.h>
int main()
{
int a[]= {1,3,5,2,3,55,44,66};
int n=sizeof(a)/sizeof(int)-1;
for(int i=0; i<=n; i++)
{ int min=a[i];
int xiabiao=i;
for(int j=i;j<=n;j++){
if(min>a[j]){
int y=a[j];
min=a[j];
a[j]=y;
xiabiao=j;
}
}
int x=a[i];
a[i]=a[xiabiao];
a[xiabiao]=x;
}
for(int i=0;i<=n;i++)
printf("%d ",a[i]);
}
3、插入排序
后面的与前面的所有都比较,小就交换,像给纸牌排序,斗地主给排排序,插入牌,排大小。
#include<stdio.h>
int main(){
int a[]={1,2,55,4,3,2,88,55};
int n=sizeof(a)/sizeof(int)-1;
for(int i=0;i<=n;i++){
for(int j=i;j>0;j--){
if(a[j]<a[j-1]){
int h=a[j];
a[j]=a[j-1];
a[j-1]=h;
}
else if(a[j]>a[j-1])break;
}
}
for(int i=0;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}