这是用C语言写好的5种最常用的排序算法:
1:冒泡排序              2:交换排序            3:选择排序
4:插入排序              5:快速排序
这5种算法都经过VC6.0测试,可以正确运行
其中带有一个洗牌函数,主要是为了打乱数组数据,方便测试排序函数。
这5种算法都参考了其它书籍,在效率上很不错。
#include<stdio.h>              //输入输出函数头文件
# include<stdlib.h>            //随机函数头文件
# include<time.h>              //时间函数头文件
//Array数组名称,n数组长度
void Wash(int Array[],int n);    //洗乱数组
void Bubble(int Array[],int n);  //冒泡排序
void Exchange(int Array[],int n); //交换排序
void Choice(int Array[],int n);  //选择排序
void Insert(int Array[],int n);  //插入排序
int Separate(int Array[],int x,int n);//用于返回快排时,首次查到的分隔位置
void Fast(int Array[],int x,int n); //快速排序
int main()                  //x是起始位置,方便递归。
{
c语言的冒泡排序算法
    int i;
    int a[10]={0,1,2,3,4,5,6,7,8,9};
    Wash(a,10);            //洗乱数组
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    putchar('\n');
    //Bubble(a,10);      //冒泡排序
    //Exchange(a,10);    //交换排序
    //Choice(a,10);      //选择排序
    //Insert(a,10);      //插入排序
    Fast(a,0,9);          //快速排序
    for(i=0;i<10;i++)
        printf("%d ",a[i]);
    putchar('\n');
return 0;
}
void Wash(int Array[],int n)    //洗乱数组
{  //这是一个比较常用的洗牌算法,将数组中的每一个元素和一个随机数下标进行交换。
    int i=0,k=0,m=0;
    srand((unsigned)time(NULL));  /*以时间为随机种子*/
    for(i=0;i<n;i++)
    {
        m=rand()%n;              //m为随机0-n之间的随机数
        k=Array[i];
        Array[i]=Array[m]; 
        Array[m]=k; 
    }
}
void Bubble(int Array[],int n)  //冒泡排序
{  //冒泡的思想是前一个元素和后一个元素进行比较,当前一个大于或小于时就交换。
    int i,k,m;
    m=n-1;              //最后一次交换元素位置,这个主要是在最后如果出现
    while(m!=0)          //连继不需要排序的元素时就可以过滤掉不需要排序的元素
    {
        k=m;            //k元素后的元素是已排序了的元素。
        m=0;            //如果这里m不至0,将会导致算法不稳定,可能出死循环
        for(i=0;i<k;i++)
        {
            if(Array[i]>Array[i+1])
            {          //每一躺比较将最大值排到最后
                int j=Array[i];
                Array[i]=Array[i+1];
                Array[i+1]=j;
                m=i;
            }
        }
    }
}
void Exchange(int Array[],int n) //交换排序
{                  //交换排序的思想是每一个待排元素和后面的所有元素进行比较
    int i,j,m;    //如果出现大于或小于就交换两元素数据
    for(i=0;i<n-1;i++)
        for(j=i+1;j<n;j++)
            if(Array[i]>Array[j])
            {
                m=Array[i];
                Array[i]=Array[j];
                Array[j]=m;
            }
}
void Choice(int Array[],int n)  //选择排序
{                    //选择排序的思想是每躺比较出最大或最小值
    int i,j,m,u;      //然后将结果和待排元素的第一个位置的元素进行交换
    for(i=0;i<n-1;i++)
    {
        m=i;          //m记录待排元素每一个元素的位置
        for(j=i+1;j<n;j++)
            if(Array[m]>Array[j])
                m=j;  //如果到最大或最小值就将元素位置保存到m
           
            if(m!=i)  //如果m元素发生变化,就说明出现新在最值或最小值
            {        //然后将结果和待排元素的第一个元素进行交换
                u=Array[i];
                Array[i]=Array[m];
                Array[m]=u;
            }
    }   
}
void Insert(int Array[],int n)  //插入排序
{              //插入排序的思想是将每个元素插入到一个待排列表中,每插入一个数据就和
    int i,j,m;  //前面的数据进行比较,保证在插入新数据前这些数据是有序的。
    for(i=1;i<n;i++)
        for(j=0;j<i;j++)
            if(Array[i]<Array[j])
            {
                m=Array[i];
                Array[i]=Array[j];
                Array[j]=m;
            }
}
void Fast(int Array[],int x,int n)    //快速排序
{              //快速排序思想是随便抽取一个元素,将抽取的元素放置到最终的位置
    int pos;  //然后按照此元素的位置将待排列表分为两个部分,按照同样的方法
    if(x<n)    //再细分,直到无法分隔为至。
    {
        pos=Separate(Array,x,n);  //将x元素放到最张位置,并将该位置返回给pos
        Fast(Array,x,pos-1);      //然后再利用递归将左边按同样方法细分
        Fast(Array,pos+1,n);      //然后再利用递归将右边按同样方法细分
    }
}
int Separate(int Array[],int x,int n) //用于返回快排时,首次查到的分隔位置
{
    int vol=Array[x];    //vol存储要进行分隔的元素数据
    while(x<n)
    {
        while(x<n && Array[n]>=vol)
            --n;              //当n位置元素大于或等于vol时就移动
        Array[x]=Array[n];    //当n位置元素小于vol时就将n位置数据放至x位置
        while(x<n && Array[x]<=vol)
            ++x;              //当x位置元素小于或等于vol时就移动
        Array[n]=Array[x];    //当x位置元素大于vol时就将x位置数据放至n位置
    }
    Array[x]=vol;//当x和n位置重合时就表示到最终分隔位置,并将数据放至该位置
    return x;    //并返回最终位置
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。