排序算法:冒泡、选择、插入、希尔

 

 

//冒泡法:相邻两数进行比较,小的放在前面大的放在后面。先比较第一个数和第二个数,小数放前,大数放后,然后再比较第二个数和第三个数,小数放前,大数放后......以此类推,直到最后两个数进行比较。然后再次重复上述步骤进行第二趟‘第三趟等等,直至排序完成。
//eg n = 10
//共计i=n-1=9趟;
//第i趟比较j=n-1-i次=9-i次.
#include <stdio.h>
int main()
{
    int a[10];
    int i,j,k;
    printf("please input n numbers with _ :\n");
    for(i=0;i<10;i++) {
        scanf("%d",&a[i]);
    }
    
    for(i=0;i<9;i++)//第0趟开始到第8趟;共计9趟
    {
        for(j=0;j<9-i;j++)//第0次开始到第9-i次;
        {
            if(a[j]>a[j+1]) {
                k = a[j];
                a[j] = a[j+1];
                a[j+1] = k;
            }
        }
    }

    printf("result :\n");
    for(i=0;i<10;i++) {
        printf("%d  ",a[i]);
    }
    return 0;
}

 

//选择排序:从未排序的数据中选出最小的一个元素顺序放在已经排好序的数列最后。设有n个数,可以经过n-1趟选择排序得到有序结果。首先把数据看作成是1~n的无序区,有序区为空;然后从无序区中选出最小的数i,将它与无序区的第一个数进行交换,使它与后面的数分别变为新的有序区和无序区;再次从无序区选出最小的数x,将它放在i的后面,直到无序区空为止。
//eg:9 5 3 0 1 4 8 2 6 7
//1:0 5 3 9 1 4 8 2 6 7
//2:0 1 3 9 5 4 8 2 6 7
//3:0 1 2 9 5 4 8 3 6 7
//4:0 1 2 3 5 4 8 9 6 7
//5:0 1 2 3 4 5 8 9 6 7
//6:0 1 2 3 4 5 8 9 6 7
//7:0 1 2 3 4 5 6 9 8 7
//8:0 1 2 3 4 5 6 7 8 9
//9:0 1 2 3 4 5 6 7 8 9
//
#include <stdio.h>
int main()
{
    int i,j,k,m = 0;
    int a[10];
    printf("please input n numbers:\n");
    for(i=0;i<10;i++){
        scanf("%d",&a[i]);
    }
    for(i=0;i<9;i++)
    {
        k=i;//将i值赋给k
        for(j=i+1;j<10;j++)//找出最小的数
        {
            if(a[k]>a[j]) k=j;//将最小的数放在位置i处
        }
        if(k != i){
            m = a[i];
            a[i]=a[k];
            a[k]=m;
        }
    }
    
    printf("result:\n");
    for(i=0;i<10;i++) {
        printf("%d ",a[i]);
    }
    return 0;
}

 

//插入排序:将一个数据插入到已经排好序的有序数据中,从而得到一个新的个数加1的有序数据;
//适用于少量数据的排序。
//
#include <stdio.h>
int main()
{
    int a[10];
    int i,j,k = 0;
    printf("please input n numbers with _ :\n");
    for(i=0;i<10;i++) {
        scanf("%d",&a[i]);
    }
    for(i=1;i<10;i++)
    {
        k = a[i];//将要插入的数赋值给变量k
        j=i-1;
        while((j>=0)&&(a[j]>k)){ //判断插入位置
            a[j+1]= a[j]; //将a[j]后移一位
            j--;
        }
        a[j+1] = k;//将k插入到a[j]的后面
    }
    printf("result :\n");
    for(i=0;i<10;i++) {
        printf("%d  ",a[i]);
    }


    return 0;
}

 

//希尔排序:基于插入排序的一种算法,增加了一个新的特征,提高了效率,不需要大量的辅助空间,与归并排序一样容易实现。但不太稳定。
//eg:5 9 4 3 2 1 0 8 6 7 
//5 9 4 3 2 /1 0 8 6 7
//1 9 4 3 2 /5 0 8 6 7
//1 0 4 3 2 /5 9 8 6 7
//1 0 4 3 2 /5 9 8 6 7
//1 0 4 3 2 /5 9 8 6 7 //第一趟5个一组,比较结果;以此类推。
//1 0 2 3 4 5 6 7 9 8  //第二趟时2个一组,共5组。
//0 1 2 3 4 5 6 7 8 9  //最后一趟时1个数一组,共分了10组。
#include <stdio.h>
int main()
{
    int a[10];
    int i,j,k,t = 0;
    printf("please input n numbers with _ :\n");
    for(i=0;i<10;i++) {
        scanf("%d",&a[i]);
    }
    
    while(k>0){
        for(i=k;i<10;i++)
        {
            j=i-k;
            while(j>=0)
                if(a[j]>a[j+k]) 
                {t=a[j];a[j]=a[j+k];a[j+k]=t;}    
                else break;
            
        }
        k/=2;
    }

    printf("result :\n");
    for(i=0;i<10;i++) {
        printf("%d  ",a[i]);
    }
    return 0;
}

 

posted @ 2017-09-11 10:18  bkycrmn  阅读(160)  评论(0)    收藏  举报