数据结构之排序总结

版权声明: https://blog.csdn.net/qq_25233621/article/details/80993174

结构体定义

typedef int ElemType; /*数据元素类型*/
/*顺序表类型定义*/
typedef  struct
{
    ElemType  data[MAX+1];
    int length;
} SeqList;

排序包括以下几个(简单排序):

插入排序

希尔排序

冒泡排序

快速排序

选择排序

函数主体部分:

//version:2017/7/9
//anthor:co-mi
int main(void)
{
    menu();
    return EXIT_SUCCESS;
}
/*线性顺序表*/
SeqList *InitSeqlist()//初始化线性表
{
    SeqList *L=(SeqList *)malloc(sizeof(SeqList));
    L->length=0;
    return L;
}
void input(SeqList *L)//输入
{
    int i;
    for(i=0; i<MAX; i++)
    {
        scanf("%d ",&L->data[i]);
        L->length++;
    }
    output(L);
}
void output(SeqList *L)//输出
{
    int i;
    for(i=0; i<L->length; i++)
    {
        printf("%d ",L->data[i]);
    }
    L->length--;
    printf("\n");
}
/*结束*/
void menu()//菜单
{
    SeqList *L;
    L=InitSeqlist();
    printf("输入数据:");
    input(L);
    printf("********************顺序表排序操作*********************\n");
    printf("                    1.冒泡排序                         \n");
    printf("                    2.快速排序法                       \n");
    printf("                    3.选择排序法                       \n");
    printf("                    4.插入排序法                       \n");
    printf("                    5.希尔排序法                       \n");
    printf("                    0.退出                             \n");
    printf("请输入你的选项:");
    int val;
    scanf("%d ",&val);
    switch(val)
    {
    case 1:
        BubbleSort(L);
        output(L);
        break;
    case 2:
        QuickSort(L,0,L->length);
        output(L);
        break;
    case 3:
        SelectSort(L);
        output(L);
        break;
    case 4:
        InsertSortSeq(L);
        output(L);
        break;
    case 5:
        ShellSort(L);
        output(L);
        break;
    case 0:
        break;
    }
}
/*排序*/
void InsertSortSeq(SeqList *L)//插入排序
{
    int i,j;
    ElemType tmp;
    for(i=1; i<L->length; i++)
    {
        tmp=L->data[i];
        for(j=i; j>0&&L->data[j]>tmp; j--)
            L->data[j]=L->data[j-1];
        L->data[j]=tmp;
    }
}
void ShellSort(SeqList *L)//希尔排序
{
    int D;
    int i,j,tmp;
    for(D=L->length/2; D>0; D/=2)
    {
        for(i=D; i<L->length; i++)
        {
            tmp=a[i];
            for(j=i; j>D&&a[j-D]>tmp; i-=D)
                a[j]=a[j-D];
            a[j]=tmp;
        }
    }
}
void BubbleSort(SeqList *L)//冒泡排序
{
    int i,j;
    ElemType tmp;
    for(i=0; i<L->length-1; i++)//外层比较次数
    {
        for(j=0; j<L->length-i-1; j++)//内层
        {
            if(L->data[j]>L->data[j+1])
            {
                tmp=L->data[j+1];
                L->data[j+1]=L->data[j];
                L->data[j]=tmp;
            }
        }
    }
}
void QuickSort(SeqList *L,int low,int high)//快速排序
{
    if(low < high)
    {
        int i=low,j=high,x=L->data[0];
        while(i<j)
        {
            while(i<j && L->data[j]>=x)//从右到左找到第一个小于x的数
                j--;
            if(i<j)
                L->data[i++]=L->data[j];

            while(i<j && L->data[i]<=x)//从左往右找到第一个大于x的数
                i++;
            if(i<j)
                L->data[j--]=L->data[i];
        }

        L->data[i]=x;//i = j的时候,将x填入中间位置
        quick_sort(L,low,i-1);//递归调用
        quick_sort(L,i+1,high);
    }
}
void SelectSort(SeqList *L)//选择排序
{
    int key,i,j;
    for(i=0; i<L->length-1; i++)
    {
        key=i;//设定能够一个标兵
        for(j=i+1; j<L->length; j++)
        {
            if(L->data[j]>L->data[j+1])
            {
                key=j;
            }
        }
        if(key!=i)
        {
            int tmp;
            tmp=L->data[key];
            L->data[key]=L->data[i];
            L->data[i]=tmp;
        }
    }
}
/*结束*/

猜你喜欢

转载自blog.csdn.net/qq_25233621/article/details/80993174