标题:[原创]六种排序方法
取消只看楼主
slp001002
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2005-12-8
 问题点数:0 回复次数:0 
[原创]六种排序方法

//六种排序方法.

#include<iostream.h>

#define max 100

class sample

{

int A[max]; int n;

friend class process;

public:

sample() {n=0;}

};

class process

{ void qsort(sample &s,int l,int h); //私有成员,quicksort()成员调用

public:

void getdata(sample &s); //获取数据

void insertsort(sample &s); //插入排序

void shellsort(sample &s); //希尔排序

void bubblesort(sample &s); //冒泡排序

void quicksort(sample &s); //快速排序

void selectsort(sample &s); //选择排序

void binsertsort(sample &s); //折半排序

void disp(sample &s); //输出结果

};

void process::getdata(sample &s)

{ int i; cout<<"元素个数: "; cin>>s.n;

for(i=0;i<s.n;i++)

{ cout<<"输入第 "<<i+1<<" 个数据: "; cin>>s.A[i]; }

}

void process::insertsort(sample &s) //插入排序

{ int i,j,temp;

for(i=0;i<s.n;i++)

{ temp=s.A[i]; j=i-1;

while (temp<s.A[j])

{ s.A[j+1]=s.A[j]; j--; }

s.A[j+1]=temp;

}

}

void process::shellsort(sample &s) //希尔排序

{ int i,j,gap,temp; gap=s.n/2;

while(gap>0)

{ for(i=gap;i<s.n;i++)

{ j=i-gap;

while (j>=gap)

if(s.A[j]>s.A[j+gap])

{ temp=s.A[j]; s.A[j]=s.A[j+gap]; s.A[j+gap]=temp; j=j-gap; }

else j=0;

}

gap=gap/2;

}

}

void process::bubblesort(sample &s) //冒泡排序

{ int j,i,temp;

for(i=0;i<s.n;i++)

for(j=s.n-1;j>i+1;j--)

{ if(s.A[j]<s.A[j-1])

{ temp=s.A[j]; s.A[j]=s.A[j-1]; s.A[j-1]=temp; }

}

}

void process::quicksort(sample &s) //快速排序

{ qsort(s,0,s.n-1); }

void process::qsort(sample &s,int l,int h)

{ int i=l,j=h,temp;

if(l<h)

{ temp=s.A[l];

do

{ while (j>i&&s.A[j]>=temp) j--;

if(i<j)

{ s.A[i]=s.A[j]; i++; }

while( i<j&&s.A[i]<=temp) i++;

if(i<j)

{ s.A[j]=s.A[i]; j--; }

}while(i<j);

s.A[i]=temp; qsort(s,l,j-1); qsort(s,j+1,h);

}

}

void process::selectsort(sample &s) //选择排序

{ int i,j,k,temp;

for(i=0;i<s.n;i++)

{ k=i;

for(j=i+1;j<s.n-1;j++)

if(s.A[j]<s.A[k]) k=j;

temp=s.A[i]; s.A[i]=s.A[k]; s.A[k]=temp;

}

}

void process::binsertsort(sample &s) //
折半排序

{ int i,j,mid,high,low;

for(i=1;i<s.n;i++)

{ s.A[s.n]=s.A[i]; low=0; high=i-1;

while(low<=high)

{ mid=(low+high)/2;

if(s.A[s.n]<s.A[mid]) high=mid-1;

else low=mid+1;

}

for(j=i-1;j>=high;--j) s.A[j+1]=s.A[j];

s.A[high+1]=s.A[s.n];

}

}

void process::disp(sample &s)

{ int i; for(i=0;i<s.n;i++) cout<<s.A[i]<<" "; cout<<endl;}

void main()

{

int sel; char c; sample s; process p; p.getdata(s); cout<<"原来排序: "; p.disp(s);

do

{ cout<<"0: 插入排序 1:希尔排序 2:冒泡排序 3:快速排序 4:选择排序

5:折半排序 其他退出"<<endl;

cout<<"选择排序结果: "; cin>>sel;

switch(sel) {

case 0:
p.insertsort(s); cout<<"插入排序结果: "; p.disp(s);

cout<<"(y/Y)否继续: "; cin>>c; break;

case 1: p.shellsort(s); cout<<"希尔排序结果: "; p.disp(s);

cout<<"(y/Y)否继续: "; cin>>c; break;

case 2: p.bubblesort(s); cout<<"冒泡排序结果: "; p.disp(s);

cout<<"(y/Y)否继续: "; cin>>c; break;

case 3: p.quicksort(s); cout<<"快速排序结果: "; p.disp(s);

cout<<"(y/Y)否继续: "; cin>>c; break;

case 4: p.selectsort(s); cout<<"选择排序结果: "; p.disp(s);

cout<<"(y/Y)否继续: "; cin>>c; break;

case 5: p. binsertsort (s); cout<<"折半排序结果: "; p.disp(s);

cout<<"(y/Y)否继续: "; cin>>c; break;

default:
c='n'; break;

}

if(c!='y'&&c!='Y') cout<<"退出排序!"<<endl;

}while(c=='y'||c=='Y');


}

搜索更多相关主题的帖子: class include process friend 
2005-12-08 13:14



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-37284-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.535019 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved