C 排序算法分析和比较


/*
排序算法分析和比较
选择法排序:选择法排序在排序过程中一共需要进行n(n-1)/2次比较,互相交换n-1次,选择法排序简单、容易实现,适用于数量较小的排序
冒泡法排序:最好的情况是正序,因此只需要比较即可,最坏的情况是逆序,需要比较n^2次,冒泡法排序是最稳定的排序方法,当待排序列有序时,效果比较好
交换法排序:交换法排序和冒泡法排序类似,正序时最快,逆序时最慢,排序有序数据时效果比较好
插入法排序:此算法需要经过n-1次插入过程,如果数据恰好应该插入到序列的最后端,则不需要移动数据,可节省时间,因此若原始数据基本有序,此算法具有较快的运算速度
折半法排序:折半法排序对于较大的n时,是速度最快的排序算法,但当n很小时,此方法往往比其他排序算法还要慢,折半法排序是不稳定的,对应有相同关键字的记录,排序后的结果可能会颠倒次序

建议
插入法,冒泡法,交换法排序的速度较慢,但参加排序的序列局部或整体有序时,这3种排序能达到较快的速度,在这种情况下,折半法排序反而会显得速度慢了,当n(需要排序元素的数量)较小时,对稳定性不做要求时宜用选择法排序,对稳定性有要求时宜用插入法或冒泡法排序
*/

 


/*
选择排序
首先选出最值(最大或最小值),然后拿这个最值和第一个值进行位置互换,然后拿第二个最值和第二个值进行位置互换,依此类推,每次拿剩余的最值和其他的值进行位置互换,直到排序完毕
*/
#include <stdio.h>
int main()
{
    int i,j;
    int a[10];
    int iIemp;
    int iPos;
    printf("为数组元素赋值:\n");
    
    /*从键盘输入,为数组元素赋值*/
    for(i=0;i<10;i++)
    {
        printf("a[%d]",i);
        scanf("%d",&a[i]);
    }
    
    /*将上面赋值过的数组进行从高到底的排序*/
    for(i=0;i<9;i++)
    {
        iIemp = a[i];    /*设置当前的值为最大的值*/
        iPos = i;        /*记录当前的位置*/
        /*循环一遍数组,找到最大值,然后记录位置*/
        for(j=i+1;j<10;j++)    
        {
            if(a[j]>iIemp)
            {
                iIemp = a[j];    /*重新设置最大值*/
                iPos = j;        /*记录元素的位置*/
            }
        }
    
    /*交换数组的两个元素的值*/
    /*让上面循环到的最大值,放第一个位置,原第一个元素放置到原最大元素的位置*/
    a[iPos] = a[i];
    a[i] = iIemp;
    }
    
    /*输出数组*/
    for(i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
        if(i == 4)
            printf("\n");
    }
    return 0;
}


/*
冒泡法排序
从数组的最后面元素开始与相邻的元素进行比较,将最小(最大的元素)放到较大(较小)的前面,依此循环,直到数组排序完毕
*/
#include <stdio.h>
int main()
{
    int i,j;
    int a[10];
    int iTemp;
    printf("为数组元素赋值:\n");
    
    /*通过键盘输入为数组元素赋值*/
    for(i=0;i<10;i++)
    {
        printf("a[%d]",i);
        scanf("%d",&a[i]);
    }
    
    /*从小到大排序*/
    for(i=1;i<10;i++)
    {
        for(j=9;j>=i;j--)
        {
            if(a[j]<a[j-1])
            {
                /*交换两个数组元素的值*/
                iTemp = a[j-1];
                a[j-1] = a[j];
                a[j] = iTemp;
            }
        }
    }
    
    /*输出数组*/
    for(i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
        if(i == 4)
            printf("\n");
    }
    return 0;
}

 

 

/*
交换法排序
将每一位数与其后的所有数一一比较(将满足条件的互换位置,然后再重新拿第一个元素与后面的比较,依此类推),若发现符合条件的数据则交换位置
*/
#include<stdio.h>
int main()
{
    int i,j;
    int a[10];
    int iTemp;
    printf("为数组元素赋值:\n");
    
    /*通过键盘输入为数组元素赋值*/
    for(i=0;i<10;i++)
    {
        printf("a[%d]",i);
        scanf("%d",&a[i]);
    }
    
    /*从到小排序*/
    for(i=0;i<9;i++)
    {
        for(j=i+1;j<10;j++)
        {
            if(a[j] > a[i])
            {
                /*交换数组两个元素的位置*/
                iTemp = a[i];
                a[i] = a[j];
                a[j] = iTemp;    /*代替了上面if后面的a[j]*/
            }
        }
    }
    
    /*输出数组*/
    for(i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
        if(i == 4)
            printf("\n");
    }
    return 0;
}

 


/*
插入法排序
在数组中取一个元素,放置到第一个位置,再冲原数组中取一个数,按一定的循序,如大小(和新数组中元素比较,放到一个合适的位置,依此类推
*/
#include<stdio.h>
int main()
{
    int i;
    int a[10];
    int iTemp;
    int iPos;
    printf("为数组元素赋值:\n");
    
    /*通过键盘输入为数组元素赋值*/
    for(i=0;i<10;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }
    
    /*数组元素从小到大排序*/
    for(i=1;i<10;i++)
    {
        iTemp = a[i];
        iPos = i-1;
        while((iPos>=0) && (iTemp<a[iPos]))
        {
            a[iPos+1] = a[iPos];
            iPos --;
        }
        a[iPos+1] = iTemp;
    }
    
    /*输出数组*/
    for(i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
        if(i == 4)
            printf("\n");
    }
    return 0;
}

 

/*
插入法排序
在数组中取一个元素,放置到第一个位置,再冲原数组中取一个数,按一定的循序,如大小(和新数组中元素比较,放到一个合适的位置,依此类推
*/
#include<stdio.h>
int main()
{
    int i;
    int a[10];
    int iTemp;
    int iPos;
    printf("为数组元素赋值:\n");
    
    /*通过键盘输入为数组元素赋值*/
    for(i=0;i<10;i++)
    {
        printf("a[%d]=",i);
        scanf("%d",&a[i]);
    }
    
    /*数组元素从小到大排序*/
    for(i=1;i<10;i++)
    {
        iTemp = a[i];    /*设置插入值*/
        iPos = i-1;        
        while((iPos>=0) && (iTemp<a[iPos]))    /*寻找插入的位置*/
        {
            a[iPos+1] = a[iPos];    /*插入到相应的位置(此处相当于新数组,在新数组中不断找到合适的位置为止再插入)*/
            iPos --;
        }
        a[iPos+1] = iTemp;
    }
    
    /*输出数组*/
    for(i=0;i<10;i++)
    {
        printf("%d\t",a[i]);
        if(i == 4)
            printf("\n");
    }
    return 0;
}

 

/*
折半法排序
在数组中选一个中间值,然后把中间值大的放一边,小的放另一边,然后再对两边分别递归使用这个过程
*/
#include<stdio.h>
/*声明函数*/
void CelerityRun(int left,int right,int array[]);

int main()
{
    int i;
    int a[8];
    printf("为数组元素赋值::\n");
    
    /*从键盘输入为数组元素赋值*/
    for(i=0;i<8;i++)
    {
        printf("a[%d]=",a[i]);
        scanf("%d",&a[i]);
    }
    
    /*从大到小排序*/
    CelerityRun(0,7,a);
    printf("8个元素从小到大的排序如下: \n");
    
    /*输出数组*/
    for(i=0;i<8;i++)
    {
        printf("%d\t",a[i]);
        if(i == 4)
            printf("\n");
    }
    printf("\n");
    return ;
}

/*定义函数*/
void CelerityRun(int left,int right,int array[])
{
    int i,j;
    int middle,iTemp;    /*定义变量*/
    i = left;
    j = right;
    middle = array[(left+right)/2];    /*求中间值*/
    do
    {
        while((array[i]<middle) && (i<right))    /*从左找小于中间值的数*/
            i++;
        while((array[j]>middle) && (j>left))    /*从右边找大于中间值的数*/
            j--;
        if(i<=j)    /*找到了这对数值*/
        {
            iTemp = array[i];    /*交换这对数值*/
            array[i] = array[j];
            array[j] = iTemp;
            i++;
            j--;
        }
    }
    while(i<=j);    /*如果两边的下标交错,就停止(完成一次)*/
    
    /*递归左半边*/
    if(left<j)
        CelerityRun(left,j,array);
    
    /*递归右半边*/
    if(right>i)
        CelerityRun(i,right,array);
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值