C语言排序算法

#include <stdio.h>
#include <stdlib.h>

void swap(int k[],int lo,int hi)
{
    int temp;

    temp=k[lo];
    k[lo]=k[hi];
    k[hi]=temp;
}
/*
**冒泡排序


void BubbleSort1(int k[],int n)
{
    int i,j,temp,count1=0,count2=0;

    for(i=0;i<n-1;i++)
    {

        for(j=i+1;j<n;j++)
        {
            count1++;
            if(k[i]>k[j])
            {
                count2++;
                temp=k[j];
                k[j]=k[i];
                k[i]=temp;
            }
        }
    }
    printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}


void BubbleSort2(int k[],int n)
{
    int i,j,temp,count1=0,count2=0;

    for(i=0;i<n-1;i++)
    {

        for(j=n-1;j>i;j--)
        {
            count1++;
            if(k[j-1]>k[j])
            {
                count2++;
                temp=k[j-1];
                k[j-1]=k[j];
                k[j]=temp;
            }
        }
    }
    printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}
*/
void BubbleSort(int k[],int n)
{
    int i,j,temp,count1=0,count2=0,flag;

    flag=1;
    for(i=0;i<n-1&&flag;i++)
    {

        for(j=n-1;j>i;j--)
        {
            count1++;
            flag=0;
            if(k[j-1]>k[j])
            {
                count2++;
                temp=k[j-1];
                k[j-1]=k[j];
                k[j]=temp;
                flag=1;
            }
        }
    }
    printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}
/*
**选择排序
*/

void SelectSort(int k[],int n)
{
    int i,j,min,temp,count1=0,count2=0;

    for(i=0;i<n-1;i++)
    {
        min=i;

        for(j=i+1;j<n;j++)
        {
            count1++;
            if(k[j]<k[min])
            {
                min=j;
            }
        }

        if(min!=i)
        {
            count2++;
            temp=k[min];
            k[min]=k[i];
            k[i]=temp;
        }
    }
    printf("总共进行了%d次比较,进行了%d次移动.\n",count1,count2);
}

/*
**插入排序
*/

void InsertSort(int k[],int n)
{
    int i,j,temp;

    for(i=1;i<n;i++)
    {
        for(j=i;j>0;j--)
        {
            if(k[j]<k[j-1])
            {
                temp=k[j];
                k[j]=k[j-1];
                k[j-1]=temp;
            }
        }
    }
}


/*
**希尔排序
*/

void ShellSort(int k[],int n)
{
    int i,j,temp;
    int h=1;

    while(h<n/3)
        h=3*h+1;

    while(h>=1)
    {
        for(i=h;i<n;i++)
        {
            for(j=i;j>=h;j-=h)
            {
                if(k[j]<k[j-h])
                {
                    temp=k[j];
                    k[j]=k[j-h];
                    k[j-h]=temp;
                }
            }

        }
        h=h/3;
    }
}

/*
**堆排序
*/

void HeapAdjust(int k[],int s,int n)
{
    int i,temp;

    temp=k[s];

    for(i=2*s;i<=n;i*=2)
    {
        if(i<n&&k[i]<k[i+1])
        {
            i++;
        }

        if(temp>=k[i])
        {
            break;
        }

        k[s]=k[i];
        s=i;
    }
    k[s]=temp;
}
void HeapSort(int k[],int n)
{
    int i;

    for(i=n/2;i>0;i--)
    {
        HeapAdjust(k,i,n);
    }

    for(i=n;i>1;i--)
    {
        swap(k,1,i);
        HeapAdjust(k,1,i-1);
    }
}

/*
**归并排序
*/
#define MAXSIZE 10

void merge(int a[],int lo,int mid,int hi)
{
    int i=lo,j=mid+1;
    int aux[MAXSIZE],k;

    for(k=lo;k<=hi;k++)
    {
        aux[k]=a[k];
    }
    for(k=lo;k<=hi;k++)
    {
        if(i>mid)
            a[k]=aux[j++];
        else if(j>hi)
            a[k]=aux[i++];
        else if(aux[j]<aux[i])
            a[k]=aux[j++];
        else
            a[k]=aux[i++];
    }
}
void MergeSort(int a[],int lo,int hi)
{
    int mid=lo+(hi-lo)/2;

    if(lo<hi)
    {
        MergeSort(a,lo,mid);
        MergeSort(a,mid+1,hi);

        merge(a,lo,mid,hi);
    }
}

/*
**归并排序迭代

void MergeSort_1(int k[],int n)
{
    int i,left_min,left_max,right_min,right_max,next;
    int *temp=(int *)malloc(n*sizeof(int));

    for(i=1;i<n;i*=2)
    {
        for(left_min=0;left_min<n-i;left_min=right_max)
        {
            right_min=left_max=left_min+i;
            right_max=left_max+i;

            if(right_max>n)
            {
                right_max=n;
            }
            next=0;

            while(left_min<left_max&&right_min<right_max)
            {
                if(k[left_min]<k[right_min])
                {
                    temp[next++]=k[left_min++];
                }
                else
                {
                    temp[next++]=k[right_min++];
                }

            }

            while(left_min<left_max)
            {
                k[--right_min]=k[--left_min];
            }

            while(next>0)
            {
                k[--right_min]=temp[--next];
            }
        }
    }
}
*/
/*
** 快速排序
*/
#define MAX_LENGTH_INSERT_SORT 7
void ISort(int k[],int lo,int hi)
{
    InsertSort(k+lo,hi-lo+1);
}
int partition(int k[],int lo,int hi)
{
    int point;

    int mid=lo+(hi-lo)/2;

    if(k[lo]>k[hi])
    {
        swap(k,lo,hi);
    }
    if(k[mid]>k[hi])
    {
        swap(k,mid,hi);
    }
    if(k[mid]>k[lo])
    {
        swap(k,mid,lo);
    }
    point=k[lo];

    while(lo<hi)
    {
        while(lo<hi&&k[hi]>=point)
        {
            hi--;
        }
        k[lo]=k[hi];
        while(lo<hi&&k[lo]<=point)
        {
           lo++;
        }
        k[hi]=k[lo];
    }
    k[lo]=point;
    return lo;
}
void Qsort(int k[],int lo,int hi)
{
    int point;

    if(hi-lo>MAX_LENGTH_INSERT_SORT)
    {
        while(lo<hi){
            point=partition(k,lo,hi);
            if(point-lo<hi-point)
            {
                Qsort(k,lo,point-1);
                lo=point+1;
            }
            else
            {
                Qsort(k,point+1,hi);
                hi=point-1;
            }
        }
    }
    else
    {
        ISort(k,lo,hi);
    }
}
void QuickSort(int k[],int n)
{
    Qsort(k,0,n-1);
}

/*
**打印结果
*/
void print(int a[])
{
    int i;

    printf("排序后的结果是:");
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}


void print_heap(int a[])
{
    int i;

    printf("排序后的结果是:");
    for(i=1;i<10;i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
}

/*
**打印排序选项
*/
void printSortItems()
{
    printf("please select items:\n");
    puts("1.BubbleSort     2.QuickSort");
    puts("3.SelectSort     4.HeapSort");
    puts("5.InsertSort     6.ShellSort");
    puts("7.MergeSort      8.Quit");
}
int main()
{
    int a[10]={5,2,6,0,3,9,1,7,4,8};
    char c;
    /*
    **堆排序从1开始
    */
    int b[10]={-1,5,2,6,0,3,9,1,7,4};
    printSortItems();
    while((scanf("%c",&c))==1)
    {
        getchar();
        switch(c)
        {
        case '1':
            BubbleSort(a,10);
            print(a);
            printSortItems();
            break;
        case '2':
            QuickSort(a,10);
            print(a);
            printSortItems();
            break;
        case '3':
            SelectSort(a,10);
            print(a);
            printSortItems();
            break;
        case '4':
            HeapSort(b,9);
            print_heap(a);
            printSortItems();
            break;
        case '5':
            InsertSort(a,10);
            print(a);
            printSortItems();
            break;
        case '6':
            ShellSort(a,10);
            print(a);
            printSortItems();
            break;
        case '7':
            MergeSort(a,0,9);
            print(a);
            printSortItems();
            break;
        case '8':
            exit(0);
        default:
            fputs("input error!\n",stderr);
            printSortItems();
            break;
        }
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yiluohan0307

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值