各种排序算法的比较 直接插入 直接选择冒泡 快速 归并 等
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
"<<"元素的移动次数为:
"<<n<<endl;
}
void Binsertsort(SeqList L) //折半排序
{
int i,j,k,low,high;
m=0,n=0;
cout<<"折半排序前的信息:"<<endl; for(i=1;i<=L.len;i++) {
cout<<L.data[i]<<" "; } cout<<endl; for(i=2;i<=L.len;i++) {
while(low<high)
{ m++; while(low<high&&L.data[high]>=key) { high--; m++; } L.data[low] = L.data[high]; n++; while(low<high && L.data[low]<=key) { low++; m++; } L.data[high] = L.data[low];
} while(top1<=middle) {
m++; L.data[i++]=R.data[top1++]; } while(top2<=r) { m++; L.data[i++]=R.data[top2++]; } } void mergesort(SeqList &L,SeqList &R,int l,int r) { if(l<r) { int middle=(l+r)/2; mergesort(L,R,l,middle); mergesort(L,R,middle+1,r); megre(L,R,l,r,middle); } } void gb(SeqList L,SeqList &R) { mergesort(L,R,1,L.len); output_SeqList(L); cout<<endl; }
using namespace std;
typedef int DataType;
int m=0,n=0;
typedef struct
{
DataType data[MAXSIZE+10];
int len;
//顺序表的长度
}SeqList;
void Init_SeqList(SeqList &L) //初始化
{
n++;
t=L.data[j];
L.data[j]=L.data[j+gap];
L.data[j+gap]=t;
j=j-gap;
}
else
j=0;
}
gap=gap/2; //减少增量
}
cout<<"希尔排序的结果为"<<endl;
for(i=1;i<=L.len;i++)
{
cout<<L.data[i]<<" ";
if(L.data[i-1]>L.data[i]) {
L.data[0]=L.data[i]; low=1; high=i-1; while(low<=high) {
k=(low+high)/2; //找中间点
if(L.data[0]<L.data[k])
{
m++;
high=k-1;
//插入点在低半区
m++; if(L.data[j]>L.data[j+1]) {
n++; x=L.data[j]; L.data[j]=L.data[j+1]; L.data[j+1]=x; flag=1; } } } cout<<"排序后的学生的信息:"<<endl; for(i=1;i<=L.len;i++) { cout<<L.data[i]<<" ";
//比较任意两种排序的函数
void bj(SeqList L) {
SeqList R; int x,y; int i,high,low; cout<<"输入第一种排序的方式"<<endl; cin>>x; switch(x) {
case 1: SelectSort(L); break;
case 2: BubbleSort(L); break;
}
int top1=l;
//左
int top2=middle+1;
//右
int i=l;
//从左面开始
while((top1<=middle)&&(top2<=r))
左l 右 r
{ m++; if(R.data[top1]<R.data[top2]) { n++; L.data[i++]=R.data[top1++]; m++; } else { m++; L.data[i++]=R.data[top2++]; }
cout<<L.data[i]<<" "; } cout<<endl; for(i=2;i<=L.len;i++) {
m++; if(L.data[i]<L.data[i-1]) {
"<<"元素的移动次数为:
L.data[0]=L.data[i];
// 复制为哨兵
for(j=i-1; L.data[0]<L.data[j]; j-- )
if(Lwk.baidu.comdata[j]<L.data[s]) {
m++; s=j; } if(s!=i) { n++; temp=L.data[i]; L.data[i]=L.data[s];
L.data[s]=temp; } } cout<<"直接选择排序的结果为"<<endl; for(i=1;i<=L.len;i++) { cout<<L.data[i]<<" "; } cout<<endl; cout<<"直接选择排序的排序码的比较次数为:"<<((i*i-i)/2)<<" 数为:"<<n<<endl; } void BubbleSort(SeqList L) //冒泡排序 { int i,j,flag=1; m=0,n=0; DataType x; cout<<"冒泡排序前的信息:"<<endl; for(i=1;i<=L.len;i++) { cout<<L.data[i]<<" "; } cout<<endl; for(i=1;((i<=L.len)&&(flag==1));i++) { m++; flag=0; for(j=1;j<L.len-i+1;j++) {
4.待排序数据量分别取 n=10,30,50,100 时,
比较同一个算法在排序过程中排序码的比较次数和元素的移动次数。
5.输出结果中,给出各算法按两种方式进行比较后的结果。*/
#include<iostream>
#include<string.h>
#include<fstream>
#define MAXSIZE 100
"<<"元素的移动次
} cout<<endl; cout<<"冒泡排序的排序码的比较次数为:"<<m<<" "<<n<<endl; } void InsertSort(SeqList L) //直接插入排序 { int i,j; m=0,n=0; cout<<"直接插入排序前的信息:"<<endl; for(i=1;i<=L.len;i++) {
}
else low=k+1;
//插入点在高半区
}
for(j=i-1;j>=high+1;j--)
{
m++;
n++;
L.data[j+1]=L.data[j];
//记录后移
}
L.data[high+1]=L.data[0]; //插入
}
} cout<<"折半排序的结果为"<<endl;
for(i=1;i<=L.len;i++)
{
cout<<"初始化成功!"<<endl;
L.len=0;
}
void set_SeqList(SeqList &L) //输入线性表的信息
{
cout<<"请输入待排序的元素的个数:"<<endl;
cin>>L.len;
cout<<"请输入待排序的数据:"<<endl;
for(int i=1;i<=L.len;i++)
/*编程实现选择、冒泡、直接插入、折半插入、希尔、快速和归并等排序算法,
并计算每种算法的比较、移动次数。
1.要求由键盘输入待排序数据的个数和待排序数据。
2.实现选择、冒泡、直接插入、折半插入、希尔、
快速和归并等排序算法。
3.比较每种排序算法在排序码个数相同的情况下,
排序过程中排序码的比较次数和元素的移动次数。
infile.getline(s,10); L.data[i]=atoi(s); //字符数组转化成整形 cout<<L.data[i]<<" "; L.len++; } } void output_SeqList(SeqList &L) //输出线性表的信息 { cout<<"请输出线性表的元素:"<<endl; for(int i=1;i<=L.len;i++) { cout<<L.data[i]<<" "; } } void SelectSort(SeqList L) //直接选择排序 { int i,j,s; cout<<"直接选择排序前的信息:"<<endl; for(i=1;i<L.len;i++) { cout<<L.data[i]<<" "; } cout<<endl; DataType temp; for( i=1;i<L.len;i++) { //m++; s=i; for(j=i+1;j<=L.len;j++)
}
L.data[low] = L.data[0];
n++;
//基准记录到位
return low;
}
void QSort(SeqList &L,int low,int high)
{
// 返回枢轴位置
int pivotloc;
if( low<high )
{
pivotloc=Partition(L,low,high); QSort(L,low,pivotloc-1); // 对低子表递归排序
{
cin>>L.data[i];
}
}
//从文件中读入数据
void ReadFile(SeqList &L,int n)
{
ifstream infile("d:\\data.txt",ios::in);
if(!infile)
{
cerr<<" 打开失败!"<<endl;
abort(); } char s[10]; for(int i=1;i<=n;i++) {
for(i=1;i<=L.len;i++)
{
cout<<L.data[i]<<" ";
}
cout<<endl;
gap=(L.len)/2;
//置增量初值
while(gap>0)
{
m++;
for(i=gap+1;i<=L.len;i++)
{
j=i-gap;
while(j>0)
if(L.data[j]>L.data[j+gap])
{
m++; L.data[j+1]=L.data[j];
// 记录后移
n++;
} L.data[j+1]=L.data[0];
// 插入到正确位置
}
}
cout<<"直接插入排序的结果为"<<endl;
for(i=1;i<=L.len;i++)
{
cout<<L.data[i]<<" ";
}
cout<<endl; cout<<"直接插入排序的排序码的比较次数为:"<<m<<"
case 3: InsertSort(L); break;
case 4: Binsertsort(L); break;
case 5: shellsort(L); break;
case 6: low=1,high=L.len; Partition(L,low,high); QSort(L,low,high); cout<<"快速排序的结果为:"<<endl; for(i=1;i<=L.len;i++) { cout<<L.data[i]<<" "; } cout<<endl; cout<<"快速排序的排序码的比较次数为:"<<m<<"
{
cout<<L.data[i]<<" ";
}
cout<<endl;
cout<<"折半排序的排序码的比较次数为:"<<m<<" "<<"元素的移动次数为:
"<<n<<endl;
} void shellsort(SeqList L) //希尔排序
{
int i,j,gap,t;
m=0,n=0;
cout<<"希尔排序前的信息:"<<endl;
}
cout<<endl;
cout<<"希尔排序的排序码的比较次数为:"<<m<<" "<<"元素的移动次数为:
"<<n<<endl;
}
int Partition(SeqList &L, int low, int high)
//快速算法
{
L.data[0] = L.data[low];
int key = L.data[low];
QSort(L,pivotloc+1,high); // 对高子表递归排序
}
} void megre(SeqList &L,SeqList &R,int l,int r,int middle) //归并排序算法
{
//int m=0,n=0;
for(int j=l;j<=r;j++)
{
m++;
R.data[j]=L.data[j];