这里我给大家做了4种排序算法的实现,分别是:冒泡排序、选择排序、直接插入排序、快速排序。其中冒泡和选择是用链式结构来实现的,因此我这里先定义了链表的基本结构和创建操作。
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode //定义链表类型
{
ElemType data; //数据域
struct LNode *next; //指针域
}LNode,*LinkList;
void CreateList(LinkList &L,int a[],int n) //初始化链表
{ int i;
LinkList p,r; //p表示指向当前节点的指针
L=(LinkList )malloc(sizeof(LNode));
L->next=NULL; //建立头结点
L->data=0; //表头数据域放的是长度
r=L; //创建尾结点
for(i=1;i<=n;i++)
{
p=(LinkList)malloc(sizeof(LNode)); //为新建立的节点申请空间
p->data=a[i];
p->next=NULL;
L->data++;
r->next=p; //把新建的节点放到尾解点之后
r=p; //新建的节点等于尾解点
}
}
void print(LinkList L) //链表的打印函数
{ int i;LinkList p;
p=L->next;
for(i=0;i<L->data;i++)
{printf("%d ",p->data);
p=p->next;
}
}
int n;
void menu()
{
printf("\n --------------------------------1.冒泡排序-------------------======");
printf("\n --------------------------------2.选择排序-------------------======");
printf("\n =================---------------3.直接插入排序-----------------==--");
printf("\n -=================--------------4.快速排序-------------------======");
printf("\n -=================--------------5.退出系统-------------------======");
}
void bubble() //冒泡排序
{
printf("输入要排序的数字个数:");
scanf("%d",&n);
int a[n],i;
printf("输入%d个数:\n",n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
LinkList L,p,q;
CreateList(L,a,n);
p=L->next;
while(p!=NULL)
{
q=p->next;
while(q!=NULL)
{
if((q->data)<(p->data))
{ int t;
t=q->data;
q->data=p->data;
p->data=t;
}
q=q->next;
}
p=p->next;
}
printf("冒泡排序结果为:\n");
print(L);
}
void select_sort() //选择排序
{
printf("输入要排序的数字个数:");
scanf("%d",&n);
int a[n],i;
printf("输入%d个数:\n",n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
LinkList L,p,q,s;
CreateList(L,a,n);
p=L->next;
while(p!=NULL)
{
int min=p->data;
q=p->next;
while(q!=NULL)
{
if(q->data<min)
{ min=q->data;
s=q;
}
q=q->next;
}
if(min!=p->data)
{ int t;
t=s->data;
s->data=p->data;
p->data=t;
}
p=p->next;
}
printf("选择排序结果为:\n");
print(L);
}
void insert_sort() //直接插入排序
{
int i,j;
printf("输入要排序的数字个数:");
scanf("%d",&n);
int a[n];
printf("输入%d个数:\n",n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=2;i<=n;i++)
{
if(a[i]<a[i-1]) //如果后边元素大
{
a[0]=a[i]; //标记哨兵
a[i]=a[i-1]; //元素右移
for(j=i-2;a[j]>a[0];j--) //找到比a[0]小的位置
a[j+1]=a[j]; //元素依次后移
a[j+1]=a[0]; //在合适位置插入标记的哨兵
}
}
printf("直接插入排序结果为:\n");
for(i=1;i<=n;i++)
{
printf("%d ",a[i]);
}
}
int partition(int left,int right,int a[])//分治算法
{ int pivoktey=a[left],t;//默认左边第一个为枢轴
while(left<right)
{
while(left<right&&a[right]>=pivoktey) right--; //从右边找比它小的
{ t=a[left];a[left]=a[right];a[right]=t; //交换
}
while(left<right&&a[left]<=pivoktey) left++; //从左边找比他大的
{ t=a[left];a[left]=a[right];a[right]=t;//交换
}
}
return left;//函数结束后已经将小的排在左边 大的排在右边 返回枢轴位置
}
void quick_sort(int a[],int left,int right)
{
int pivotloc;
if(left<right)
{ pivotloc=partition(left,right,a); //将数组一分为二
quick_sort(a,left,pivotloc-1); //左边排序
quick_sort(a,pivotloc+1,right); //右边排序
}
}
void quick()
{ printf("输入要排序的数字个数:");
scanf("%d",&n);
int a[n],i;
printf("输入%d个数:\n",n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quick_sort(a,1,n);
printf("快速排序结果为:\n");
for(i=1;i<=n;i++)
printf("%d ",a[i]);
}
int main()
{ int i,choice;
while(1)
{ menu();
printf("\n\n请输入您的选项:\n");
scanf("%d",&choice);
switch(choice)
{
case 1: bubble();break;
case 2: select_sort();break;
case 3: insert_sort();break;
case 4: quick(); break;
case 5: return 0;
}
}
return 0;
}
运行结果为: