#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct{
int list[MAXSIZE]; //存放序列
int length; //存放序列长度
}SqList;
void menu()
{
printf("=====================\n");
printf("\n排序法:\n");
printf("1.输出菜单\n");
printf("2.输入待排序的序列\n");
printf("3.冒泡排序法\n");
printf("4.简单选择排序法\n");
printf("5.直接插入排序法\n");
printf("6.退出!\n");
printf("=====================\n");
}
void CreateList(SqList &L,int n) //创建序列
{
L.length = n; //将元素长度交给结构体中变量 后续就不再修改
for(int i=0;i<L.length;i++) //循环输入元素
{
printf("\n请输入第%d个元素:",i+1);
scanf("%d",&L.list[i]);
}
}
//输出序列
void Outlist(SqList L)
{
for(int i=0;i<L.length;i++)
{
printf("%d\t",L.list[i]);
}
printf("\n");
}
//冒泡排序法
void Bubble(SqList &L)
{
int x=0;
for(int i=L.length-1;i>0;i--)
{
for(int j=0;j<i;j++) //不断的与后一个数进行比较,找到一个最大数,放在最后
if(L.list[j]>L.list[j+1])
{
x = L.list[j];
L.list[j] = L.list[j+1];
L.list[j+1] = x;
}
}
}
//选择排序法
//找到一个最小数,放在前面,
void Select(SqList &L)
{
int min=0,temp=0;
for(int i=0;i<L.length;i++)
{
min = i;
for(int j=i+1;j<L.length;j++)
if(L.list[j]<L.list[min])
min = j;
if(min != i)
{
temp = L.list[i];
L.list[i] = L.list[min];
L.list[min] = temp;
}
}
}
/*插入排序法
需要数组中的元素下标从1开始,0下标作为一个临时存放的监视哨,*/
void Insert(SqList &L)
{
for(int i=L.length-1;i>=0;i--) //此循环将数组中元素下标调整为从1开始
{
L.list[i+1] = L.list[i];
}
for(int i=2;i<=L.length;i++)
{
if(L.list[i]<L.list[i-1])
{
int j=0;
L.list[0] = L.list[i];
L.list[i] = L.list[i-1];
for(j=i-2;L.list[0]<L.list[j];j--)//如果判断条件不成立,则跳过循环,执行下一句
{
L.list[j+1] = L.list[j];
}
L.list[j+1] = L.list[0];
}
}
for(int i=0;i<L.length;i++) //此循环将数组下标调整为从0开始
L.list[i] = L.list[i+1];
}
int main()
{
SqList LL,L; //定义一个结构体
int n=0; //用来接收元素长度
int c = 1;
while(c)
{
menu();
printf("请选择1~6\n");
scanf("%d",&c);
switch(c)
{
case 1:
system("cls");
menu();
break;
case 2:
printf("\n输入待排元素的个数:\n");
scanf("%d",&n);
CreateList(L,n);
printf("\n");
break;
case 3:
printf("-----冒泡排序-----\n");
printf("排序前的序列为:\n");
Outlist(L);
LL = L;
Bubble(LL);
printf("排序后的序列为:\n");
Outlist(LL);
break;
case 4:
printf("-----简单选择排序-----\n");
printf("排序前的序列为:\n");
Outlist(L);
LL = L;
Select(LL);
printf("排序后的序列为:\n");
Outlist(LL);
break;
case 5:
printf("-----直接插入排序-----\n");
printf("排序前的序列为:\n");
Outlist(L);
LL = L;
Insert(LL);
printf("排序后的序列为:\n");
Outlist(LL);
break;
case 6:
printf("已退出!\n");
exit(0); //此函数的头文件为 stdlib.h
break;
default:
printf("输入错误,请重新输入:");
c = 1;
}
}
return 0;
}
第一次从无到有的写了这样一个完整的程序,算式对基础知识的一次总结,收获很多,发出来是想作为一个成长记录,同时也希望能帮到有需要的同学,这里包含了三个排序算法:冒泡排序法,选择排序法,插入排序法.比较简单.