#include <stdio.h>
#include <stdlib.h>
#define MAX 50 /*线性表的最大长度*/
typedef int ElemType; /*数据元素类型*/
/*顺序表类型定义*/
typedef struct
{
ElemType data[MAX];
int length; /*当前表的长度*/
} SeqList;
//创建一个最大长度为50的数组,当然是最大,没有让你全部都用完
SeqList *InitSeqlist(){
SeqList *head=(SeqList*)malloc(sizeof(SeqList));//定义一个结构体的指针
head->length=0;//初始化长度为0
return head;//返回创建好的一个不知道有木有顺序的数组
}
//输入元素
void input(SeqList *L){
int n;
printf("Please input n what you want ?\n");
scanf("%d",&n);
int i;
for(i=0;i<n;i++){//依次获得每一个数据元素
printf("Please input %d number:",i+1);
scanf("%d",&L->data[i]);
L->length++;
printf("\n");
}
}
//打印输出结果
void output(SeqList *L){
int i;//计数器
for(i=0;i<L->length;i++){//依次遍历每一个元素
printf("%d ",L->data[i]);
}
printf("\n");
}
//实现插入算法
void InsertSortSeq(SeqList *L){
int i,j,temp;//计数器,计数器,临时变量
for(i=1;i<L->length;i++){
j=i-1;
temp=L->data[i];//存储临时的变量
for(;j>=0&&L->data[j]>temp;j--){
L->data[j]=L->data[j-1];//向后面移动
}
L->data[++j]=temp;//将当前的空空填进去
}
}
//实现希尔排序
void ShellSort(SeqList *L){
int i,j,temp,d;//计数器,计数器,临时变量,步长
for(d=L->length/2;d>0;d=d/2){//首先给出步长
for(i=d;i<L->length;i++){
temp=L->data[i];//临时取出数据
for(j=i-d;j>=0&&temp<L->data[j];j=j-d){
L->data[j+d]=L->data[j];//向后移动
}
L->data[d+j]=temp;//将临时的变量放回去
}
}
}
//实现冒泡排序
void BubbleSort(SeqList *L){
int i,j,temp;//定义计数器,缓存变量
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]){//完成两个元素之间的交换
temp=L->data[j];
L->data[j]=L->data[j+1];
L->data[j+1]=temp;
}
}
}
}
//实现快速排序
void QuickSort(SeqList *L,int low,int high){
int i=low,j=high,temp=L->data[i];
if(i<j){
while(i!=j){//当i=j时退出循环
while(i<j&&L->data[j]>=temp) j--;
if(i<j) L->data[i++]=L->data[j];
while(i<j&&L->data[i]<=temp) i++;
if(i<j) L->data[j--]=L->data[i];
}
L->data[i]=temp;
QuickSort(L,low,i-1);
QuickSort(L,i+1,high);
}
}
//实现选择排序
void SelectSort(SeqList *L){
int i,j,min,temp;//计数器和最小值下标
for(i=0;i<L->length-1;i++){
min=i;//先要有一个对比的
for(j=i+1;j<L->length;j++){
if(L->data[j]<L->data[min]){
min=j;//记录下最小的
}
}
if(i!=min){//交换最小的
temp=L->data[min];
L->data[min]=L->data[i];
L->data[i]=temp;
}
}
}
int men(SeqList *head){
printf("\t\t\t请输入你的选择!!!!!!!!!!!!\n");
printf("\t\t\t|****************顺序表排序操作***********|\n");
printf("\t\t\t| 1. 冒泡排序法 |\n");
printf("\t\t\t| 2. 快速排序法 |\n");
printf("\t\t\t| 3. 选择排序法 |\n");
printf("\t\t\t| 4. 插入排序法 |\n");
printf("\t\t\t| 5. 希尔排序 |\n");
printf("\t\t\t| 0.退出 |\n");
printf("\t\t\t|*****************************************|\n");
int a;
scanf("%d",&a);
switch(a){
case 1:BubbleSort(head);break;
case 2:QuickSort(head,0,head->length);break;
case 3:SelectSort(head);break;
case 4:InsertSortSeq(head);break;
case 5:ShellSort(head);break;
case 0:return -1;
default :
printf("请输入正确的编号");
break;
}
printf("排序之后的样子: ");
output(head);
}
int main(){
SeqList *head=InitSeqlist();//初始化结构体变量
input(head);
while(men(head)!=-1);//进行循环
return 0;
}