C++编程中排序的算法

#include "stdafx.h"
typedef struct
{
int key;
}elemtype;

void InsertSort(elemtype x[],int n)//简单插入排序
{
int i,j;
elemtype a;
for(i=0;i<n-1;i++)
{
a=x[i+1];
j=i;
while(j>-1 && a.key<x[j].key)
{
x[j+1]=x[j];
j--;
}
x[j+1]=a;
}
}

void SelectSort(elemtype x[],int n)//简单选择排序
{
int i,j,small;
elemtype swap;
for(i=0;i<n-1;i++)
{
small=i;
for(j=i+1;j<n;j++)
{
if(x[j].key<x[small].key)
small=j;
}
if(small!=i)
{
swap=x[i];
x[i]=x[small];
x[small]=swap;
}
}
}

void PopSort(elemtype x[],int n)//冒泡发排序
{
int i,j,flag;
elemtype swap;
flag=1;
for(i=0;i<n-1 && flag==1;i++)
{
flag=0;
for(j=0;j<n-1;j++)
if(x[j].key>x[j+1].key)
{
flag=1;
swap=x[j];
x[j]=x[j+1];
x[j+1]=swap;
}
if(flag==0)
return;
}
}

void QuickSort(elemtype x[],int left,int right)//快速排序
{
int i,j;
elemtype swap;
i=left;j=right;
swap=x[left];
while(i<j)
{
while(i<j && swap.key<=x[j].key)
j--;
if(i<j)
{
x[i]=x[j];
i++;
}
while(i<j && swap.key>=x[i].key)
i++;
if(i<j)
{
x[j]=x[i];
j--;
}
}
x[i]=swap;
if(left<i)
QuickSort(x,left,i-1);
if(i<right)
QuickSort(x,j+1,right);
}

void merge(elemtype R[],elemtype x[],int k,int n)//归并排序
{
int i1,i2,L1,L2,r1,r2,j;
L1=0;j=0;
while(L1+k<n-1)
{
L2=L1+k;
r1=L2-1;
r2=(L2+k-1<=n-1)?L2+k-1:n-1;
for(i1=L1,i2=L2;i1<=r1 && i2<=r2;j++)
{
if(R[i1].key<=R[i2].key)
{
x[j]=R[i1];
i1++;
}
else
{
x[j]=R[i2];
i2++;
}
}
while(i1<=r1)
{
x[j]=R[i1];
i1++;j++;
}
while(i2<=r2)
{
x[j]=R[i2];
i2++;j++;
}
L1=r2+1;
}
for(i1=1;i1<n;i1++,i2++)
x[j]=x[i1];
}

void MergeSort(elemtype R[],int n)//归并排序的调用函数
{
int i,k;
elemtype x[99];
k=1;
while(k<n)
{
merge(R,x,k,n);
for(i=0;i<n;i++)
R[i]=x[i];
k=2*k;
}
}

void PrintfNb(elemtype x[],int nCount)//输出数组元素
{
printf("排序结果:/n");
for(int i=0;i<nCount;i++)
printf("%d ",x[i].key);
printf("/n");
printf("排序结束.../n");
}

void main()
{
int n,i,nSelect;
elemtype nList[99];//定义一个数组
printf("请输入数组元素.../n");
for(i=0;i<99999;i++)
{
scanf("%d",&n);
if(n==0)
break;//输入0时创建数组完毕
nList[i].key=n;
printf("输入成功.../n");
}
printf("请选择排序方法.../n");
printf("1,简单插入排序 2,简单选择排序 3,冒泡发排序 4,快速排序 5,归并排序/n");
scanf("%d",&nSelect);
while(nSelect>5 || nSelect<1)
{
printf("请输入正确的序号!");
scanf("%d",&nSelect);
}
switch(nSelect)
{
case 1:
printf("你选择的是简单插入排序法.../n");
InsertSort(nList,i);
break;
case 2:
printf("你选择的是简单选择排序法.../n");
SelectSort(nList,i);
break;
case 3:
printf("你选择的是冒泡排序法.../n");
PopSort(nList,i);
break;
case 4:
printf("你选择的是快速排序法.../n");
QuickSort(nList,0,i);
break;
case 5:
printf("你选择的是归并排序法.../n");
MergeSort(nList,i);
}
PrintfNb(nList,i);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值