排序算法大全

转自:/作者:编程小梦 网址:www.bcmeng.com


#include<stdio.h>
#include<stdlib.h>
#define maxsize 100
typedef int datatype;


void SelectSort(datatype x[],int n) //选择排序
{
    int i,j,k;
    datatype temp;
    for(i=0;i<n;i++)
    {
        k=i;
        for(j=i;j<n;j++) //从无序区选择最小元素
            if(x[k]>x[j])
            k=j;  //用K指出每趟在无序区的最小元素
        temp=x[i];  //将想x[i]和x[k]交换
        x[i]=x[k];
        x[k]=temp;
    }
}


void BubbleSort(datatype x[],int n)//冒泡排序
{
    int i,j;
    datatype temp;
    for(i=0;i<n-1;i++)
    {
        for(j=n-1;j>i;j--)//比较,找出最小关键字的记录
            if(x[j]<x[j-1])
            {temp=x[j];//x[j]与[j-1]进行交换,将最小关键字记录前移
           x[j]=x[j-1];
           x[j-1]=temp;
            }
    }
}
void InsertSort(datatype x[],int n)//直接插入排序
{
    int i,j;
    datatype temp;
    for(i=1;i<n;i++)
    {
        temp=x[i];
        j=i-1;
        while(j>=0&&temp<x[j]) //元素后移,以便腾出一个位置插入temp
        {
            x[j+1]=x[j];
            j--;
        }
        x[j+1]=temp; //在j+1位置处插入temp即想x[i]
    }
}
void ShellSort(datatype x[],int n)//希尔排序
{
    int i,j,gap;
    datatype temp;
    gap=n/2;  //增量置初值
    while(gap>=1)
    {
    for(i=gap;i<n;i++) //对所有相隔gap位置的元素组进行排序
    {
        temp=x[i];
        j=i-gap;
        while(j>=0&&temp<x[j])//对相隔gap位置的元素组进行排序
        {
            x[j+gap]=x[j];
            j=j-gap;
        }
        x[j+gap]=temp;
    }
    gap=gap/2; //减小增量
    }
}


void Sift(datatype x[],int low,int high)
{
    int i=low,j=2*i+1;  //x[j]是x[i]的左孩子。因为下标是从0开始。
    datatype temp=x[i];
    while(j<high)
    {
        if(j<high&&x[j]<x[j+1])//若右孩子较大,把J指向右孩子
            j++;
        if(temp<x[j])
        {
            x[i]=x[j]; //将x[j]调整到双亲结点上
            i=j;//修改i和j的值,以便继续向下筛选
            j=2*i+1;
        }
        else  break;  //筛选结束
    }
    x[i]=temp;//被筛选结点的值放入最终位置
}
void HeapSort(datatype x[],int n) //堆排序
{
    int i;
    datatype temp;
    for(i=n/2;i>=0;i--) //循环建立初始堆
    Sift(x,i,n);
    for(i=n-1;i>=1;i--) //进行n-1次循环,完成堆排序
    {
        temp=x[0];//将第一个元素同当前区间内x[1]交换
        x[0]=x[i];
        x[i]=temp;
        Sift(x,0,i-1);//筛选x[1]结点,得到i-1个结点的堆
    }


}


void QuickSort(datatype x[],int s,int t)//快速排序
{
    int i=s,j=t;
    datatype temp;
    if(s<t&&s>=0&&j>=0)//区间内至少存在一个元素且元素均大于0
    {
        temp=x[s]; //用区间的第一个元素作为基准
        while(i!=j) //从区间俩端交替向中间扫描,知道i=j为止
        {
            while(j>i&&x[j]>temp)
                j--;  //从右向左扫描,直到第一个元素小于temp
            if(i<j) //表示找到这样的x[j],x[i]和x[j]交换
            {
                x[i]=x[j];
                i++;
            }
            while(i<j&&x[i]<temp)
                i++;//从左向右扫描,直到第一个元素大于temp
            if(i<j)
            {
                x[j]=x[i];//表示找到这样的x[i],x[i]和x[j]交换
                j--;
            }
        }
        x[i]=temp;
        QuickSort(x,s,i-1);//对左区间递归排序


        QuickSort(x,i+1,j);//对右区间递归排序
    }
}


void Merge (datatype x[],int low,int mid,int high) //归并排序
{
    datatype *x1;
    int i=low ,j=mid+1,k=0;//k是x1的下标,i,j分别为第一,二段的下标
    x1=(datatype*)malloc ((high-low+1)*sizeof(datatype));//动态分配空间
    while(i<=mid&&j<=high)//在第一段和第二段未扫描完时继续循环
    if(x[i]<=x[j])
    {
        x1[k]=x[i]; //将第一段的记录放入x1中
        i++;
        k++;
    }
    else
    {
        x1[k]=x[j];//将将第二段的记录放入x1中
        j++;
    }
    while(i<=mid) //将第一段余下部分复制到x1
    {
        x1[k]=x[i];
        k++;
        i++;
    }
    while(j<=high)//将第二段余下部分复制到x1
    {
        x1[k]=x[j];
        j++;
        k++;
    }
    for(k=0,i=low;i<=high;k++,i++)
        x[i]=x1[k];  //将x1复制回x中
}


void MergePass(datatype x[],int length,int n)
{
    int i;
    for(i=0;i+2*length-1<n;i=i+2*length) //归并length长的俩相邻子表
        Merge(x,i,i+length-1,i+2*length-1);
    if(i+length-1<n)  //余下俩个子表,后者长度小于lengtth
        Merge(x,i,i+length-1,n-1); //归并这俩个子表
}
void MergeSort(datatype x[],int n) //二路归并算法
{
    int length;
    for(length=1;length<n;length=2*length)
        MergePass(x,length,n);
}
void Create(datatype x[],int n)
{  int i;
    for(i=0;i<n;i++)
        scanf("%d",&x[i]);
}




void Display(datatype x[],int n)
{   int i;
    for(i=0;i<n;i++)
        printf("%d ",x[i]);
}


int main()
{   datatype x[maxsize];
    int n;
    printf("请输入数组的大小:\n");
    scanf("%d",&n);
    printf("\n请输入数组元素:\n");
    Create(x,n);
    MergeSort(x,n);
    Display(x,n);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值