C语言 排序算法综合系统

排序算法综合系统

目的要求
本课程设计任务的目的是要求学生按照分析,设计,编码,调试和测试的软件开发过程独立完成一个排序算法综合系统,并实现本系统的功能要求

功能要求
题目描述
1. 具有选择排序功能
2. 具有冒泡排序功能
3. 具有插入排序功能
4. 具有合并排序功能

题目要求
1. 为各项操作功能设计一个菜单,应用程序运行后,先显示这个菜单,然后用户通过菜单选项选择进行的操作项目
2. 要求以上功能分别用函数实现,并要求用C语言的文件操作语句将以上所有结果保存在文件XX.out

输入输出要求
1. 应用程序运行后,先显示一个菜单,然后用户根据需要选择相应的操作项目。进入每个操作后,根据程序的提示输入相应的信息
2. 要求用户输入数据时,要给出清晰,明确的提示信息,包括输入的数据内容,格式和结束方式
大家帮个忙啊,我下个星期要交的
谁会得我在加100分 ,你做的有点问题啊
:\vc98\include\eh.h(32) : fatal error C1189: #error : "eh.h is only for C++!"
执行 cl.exe 时出错.
你帮我用C++ 6.0做一份直接发给我,我邮箱[email protected],谢谢

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<iostream>
using namespace std;
void find(int *a,int n);
void input(int pIn[], int n);
void del(int *a,int n);
void Swap(int *a, int *b);
int Partition(int a[], int p, int r);
void arrange(int *c,int length);
template <class Type>
/* 为了便于维护,现在把排序封装在类ArraySort内
*/
class ArraySort
{
private: int elem; //elem的值决定按升序还是降序
int len; //排序数组的长度
Type *b; //排序时用与交换的数组
Type *a; //用来存放要排序的数组;
public:
void set(Type c[],int k); //接收要排序的数组及数组长度
void Sort(); //进行排序
void MergeSort(int ,int );
void Merge(int ,int ,int); //进行合并
void Copy(int ,int); //复制一个数组到另一个数组
void ArPrint(); //输出数组元素
void ReturnCopy(Type c[]); //把已经排序数组返回给原数组
~ArraySort();
ArraySort(int k=0){
elem=k;
len=0;
a=NULL;
b=NULL;
}
};
template<class Type>
void ArraySort<Type>::set(Type c[],int k )
{ int m;
len=k;
//len=c.length;
a=new Type[len];
b=new Type[len];
if((a==NULL)||(b==NULL))
{ cout<<"can't allocate more memory,terminating."<<endl;
exit(1);
}
else{
for(int i=0;i<len;i++)
a[i]=c[i];
}
cout<<" input the number 0 or 1:"<<endl;
cout<<"0 min to max:"<<endl;
cout<<"1 max to min"<<endl;
cin>>m;
if(m>=0&&m<=1)
elem=m;
else {
cout<<"You input a illegal number!!";
cout<<" input the number 0 or 1:"<<endl;
cout<<"0 min to max:"<<endl;
cout<<"1 max to min"<<endl;
}
}
template <class Type>
void ArraySort<Type>::Sort()
{
MergeSort(0,len-1);
}
template <class Type>
void ArraySort<Type>::Merge(int left,int m,int right)
{
int i=left,
j=m+1,
k=left;
if(elem==0){
while((i<=m)&&(j<=right))
if(a[i]<=a[j]) b[k++]=a[i++];
else b[k++]=a[j++];
}
else{
while((i<=m)&&(j<=right))
if(a[i]>=a[j]) b[k++]=a[i++];
else b[k++]=a[j++];
}
while(i<=m)
b[k++]=a[i++];
while(j<=right)
b[k++]=a[j++];
}
template <class Type>
void ArraySort<Type>::Copy(int left,int right)
{
for(int i=left;i<=right;i++)
a[i]=b[i];
}
template <class Type>
void ArraySort<Type>::ArPrint()
{
// int len=this.a.length;
cout<<"The length of array is :"<<len<<endl;
cout<<"The elements of array is :"<<endl;
for(int i=0;i<len;i++)
cout<<" "<<a[i];
if(i/5==0)
cout<<endl;
}
template <class Type>
void ArraySort<Type>::MergeSort(int left,int right)
{
if(left<right){
int i=(left+right)/2;
MergeSort(left,i);
MergeSort(i+1,right);
Merge(left,i,right);
Copy(left,right);
}
}
template <class Type>
void ArraySort<Type>::ReturnCopy(Type c[])
{
for(int i=0;i<len;i++)
c[i]=a[i];
}
template <class Type>
ArraySort<Type>::~ArraySort()
{
delete a;
delete b;
}

void qSort(int pIn[], int p/*0*/, int r/*r = N - 1*/);
main()
{ char c;
int i,a[12]={6,11,12,5,1,13,8,9,14,7,10},exit=1;
do
{
system("cls");
for(i=0;i<80;i++)
printf("*");
printf("\t 1:选择排序法\n");
printf("\t 2:冒泡排序法\n");
printf("\t 3:插入排序法\n");
printf("\t 4:合并排序法\n");
printf("\t 5:退出\n");
printf("\t 请选择输入选项【1\\2\\3\\4\\5】:\n");
do
{
c=getch();
}while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5');

switch(c)
{ case '1':input(a,11);
cout<<endl;
for(i=0;i<11;i++)
cout<<a[i]<<" ";
cout<<endl;
break;
case '2':del(a,11);
cout<<endl;
for(i=0;i<11;i++)
cout<<a[i]<<" ";
cout<<endl;break;
case '3':find(a,11); break;
case '4':arrange(a,11); break;
case '5':exit=0;
}
printf("按任意键返回主菜单:\n");
getche();

}while(exit);
}
void input(int pIn[], int n)
{
qSort(pIn, 0, n-1);
}
void Swap(int *a, int *b){
int c = *a;
*a = *b;
*b = c;
}

int Partition(int a[], int p, int r)
{
int i = p;
int j = r + 1;
int x = a[p];

while(1){
while (i <= r && a[++i] < x); // 如果你要从大到小排序就改x前的<为>
while (j >= p && a[--j] > x); //同时这的>也要改为<
if (i >= j) break;
Swap(&a[i], &a[j]);
}

if (i == j) {
j --;
}

a[p] = a[j];
a[j] = x;
return j;
}

void qSort(int pIn[], int p/*0*/, int r/*r = N - 1*/)
{
if (p < r) {
int q = Partition(pIn, p, r);
qSort(pIn, p, q - 1);
qSort(pIn, q + 1, r);
}
}
void del(int *a,int n)//冒泡
{
int i,j,k;
for(i=0;i<=n-2;i++)
for(j=0;j<=n-2-i;j++)
if(a[j]>a[j+1])//如果你要从大到小排序就改>为<
{
k=a[j];
a[j]=a[j+1];
a[j+1]=k;
}
}

void find(int *a,int n)//插入
{
int i, j, x;
for(i = 1;i < n;i++)
{
x = a[i];
j = i - 1;

while(j >= 0 && a[j] > x){
a[j+1] = a[j];
j--;
}

a[j+1] = x;
}
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void arrange(int *c,int length)//组合
{
int i;

ArraySort<int > as;
as.set(c,length);
cout<<"排序前的数组元素序列:"<<endl;
for( i=0;i<length;i++)
cout<<" "<<c[i];
cout<<endl;
as.Sort();

as.ReturnCopy(c);

cout<<"排序后的数组元素序列:"<<endl;
for( i=0;i<length;i++)
cout<<" "<<c[i];
cout<<endl;
}
楼主做了我2个多小时啊。。TC不能识别有的头文件哈,我已经用VC6.0测试过了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-22
#include<stdio.h>
#include <stdlib.h>
#define N 6
void SelectSort(int L[],int n); //选择排序
void InsertSort(int r[],int n); //插入排序
void BubbleSort(int r[],int n); //冒泡排序
void MergeSort( int r[],int r1[],int n); //归并排序

void main()
{
int i,a[N],b[N];
char c;
printf("输入个数:");
for(i=1;i<N;i++) //后面几种排序方法中用到的下标都从开始,故此处与其保持一致
scanf("%4d",&a[i]);
do
{
for(int i=0;i<80;i++)
printf("*");
printf("\t 1:选择排序法\n");
printf("\t 2:冒泡排序法\n");
printf("\t 3:插入排序法\n");
printf("\t 4:合并排序法\n");
printf("\t 5:退出\n");
printf("\t 请选择输入选项【\\2\\3\\4\\5】:\n");
do
{
c=getchar();
}while(c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5');
switch(c)
{
case '1':SelectSort(a,N); break;
case '2':BubbleSort(a,N); break;
case '3':InsertSort(a,N); break;
case '4':MergeSort(a,b,N); break;
case '5':exit(0);
}
printf("按任意键返回主菜单:\n");
//getchar();
}while(1);
}
void SelectSort(int L[],int n) //简单选择排序
{
int i,j,k,t;
for(i=1;i<n;i++) //选择第i+1小的元素,并交换到位
{
j=i;
for(k=i+1;k<n;++k)
if (L[k]<L[j]) j=k; //L[j] 中存放的是第i+1小的元素
if(j!=i)
{ t=L[i]; //交换
L[i]=L[j];
L[j]=t;
}
}
for(i=1;i<N;i++)
printf("%4d",L[i]);
}

void InsertSort(int r[],int n) //插入排序
{ int i,j;
for(i=1;i<n-1;i++)
{ r[0]=r[i+1]; // r[0]: 监视哨
j=i;
while(r[0] <r[j])
{ r[j+1]=r[j]; //记录后移
j--;
}
r[j+1]= r[0]; // 插入
}
for(i=1;i<N;i++)
printf("%4d",r[i]);
}

void BubbleSort(int r[],int n) //冒泡排序
{ //int flag=1,i; //当flag为,则停止排序
int i;
for (int i=n;i>=2;i--) //i表示趟数,最多n-1趟
{
//flag=0; //开始时元素未交换
for(int j=1;j<i-1;j++) //一开始写了个"j<=i-1",花了半个多小时才发现错误
{
if(r[j]>r[j+1])
{
int t=r[j];
r[j]=r[j+1];
r[j+1]=t;
//flag=1; // 交换
}
//if(flag==0) return; //若无交换则停止退出循环
}
}
for(i=1;i<N;i++)
printf("%4d",r[i]);
}

void merge(int r[],int r1[],int low,int mid,int high)
//r[low]到r[mid]与r[mid+1]到r[high]是两个有序子文件
//本算法将其归并成一个有序子文件从r1[low]到r1[high]
{
int i=low; int j=mid+1; int k=low;
while ((i<=mid) && (j<=high))
if (r[i]<=r[j]) r1[k++]=r[i++];//取小者复制
else r1[k++]=r[j++];
while (i<=mid) r1[k++]=r[i++];//复制第一个文件剩余记录
while (j<=high) r1[k++]=r[j++];//复制第二个文件剩余记录
}
//对r进行一趟归并,结果放在r1中
void mergepass(int r[],int r1[],int n,int length)
// length是本趟归并的有序子文件的长度
{ int i=1,j; //指向第一对子文件起始点
while (i+2*length<=n)//待归并记录至少有两个长度为length的子文件
{ merge(r,r1,i,i+length-1,i+2*length-1);
i=i+2*length; //指向下一对子文件起始点
}
if (i+length<n)//剩下两个子文件,其中一个长度小于length
merge(r,r1,i,i+length-1,n-1);
else //子文件个数为奇数,将最后一个子文件复制到r1中
for (j=i;j<n;j++) r1[j]=r[j];
}
void MergeSort( int r[],int r1[],int n ) //归并排序
{
int length=1,i;
while (length<n)
{
mergepass(r,r1,n,length) ; // 一趟归并,结果在r1中
length=2*length; //区间扩大一倍
mergepass(r1,r,n,length) ; // 再次归并,结果在r中
length=2*length;
}
for(i=1;i<n;i++)
printf("%4d",r[i]);
}

参考资料:花了N个小时

相似回答