C语言各种排序思想

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;
}
 

猜你喜欢

转载自blog.csdn.net/qq_36045385/article/details/82215882