版权声明: 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;
}
}
}
/*结束*/