}
}
voidmain()
{
ETa[8];
a[0].no=36;
a[0].name="BillGates";
a[0].sex="男";
a[0].score=100;
a[1].no=25;
a[1].name="FFGates";
a[1].sex="女";
a[1].score=98;
a[2].no=48;
a[2].name="LucyGates";
a[2].sex="男";
a[2].score=77;
a[3].no=12;
a[3].name="JackGates";
a[3].sex="男";
a[3].score=88;
a[4].no=65;
a[4].name="GGGates";
a[4].sex="女";
a[4].score=66;
a[5].no=43;
a[5].name="BBGates";
a[5].sex="男";a[5].score=99;
a[6].no=20;
a[6].name="KKGates";
a[6].sex="男";
a[6].score=78;
a[7].no=58;
a[7].name="PPGates";
a[7].sex="男";
a[7].score=99;
cout<<"\n========排序前========================\n\n";
display(a);
insertSort(a,8);
cout<<"\n========排序后(按学号排序)==============\n\n";
display(a);
insertSort1(a,8);
cout<<"\n========排序后(按学分排序)==============\n\n";
display(a);
}
2)快速排序(quicksorting)(不稳定算法)
是目前所有排序方法中速度最快的排序方法(但逼简单排序方法多占用n个栈空间)。
在最好的和一般的情况下,T(n)=O(nlog2n),但在最坏的情况下(原排序对象已经有序),T(n)=O(n2),与简单排序方法相当,且多占用n个栈空间,从而成为最差的排序方法。
所以,为了避免这种情况发生,1是实现判断,如果是这种情况,采用其它排序方法,2改进快速排序方法。
算法:
在排序区间最后一个元素后边放一个“岗哨”;
每次以待排序区间的第一个元素为基准元素,分成2个区间,前边的区间的元素值都小于基准元素,后边的区间的元素都大于基准元素,递归上边的过程,使得每个区间只有一个元素,排序完成。
A={45,53,18,36,72,30,48,93,15,36}
[45,53,18,36,72,30,48,93,15,36]
ij
[45,36,18,36,72,30,48,93,15,53]
ij
[45,36,18,36,15,30,48,93,72,53](i>j)
ji
[30,36,18,36,15],45,[48,93,72,53](交换A[s]和A[j])
……
……
[15,18,36,36,45,48,53,72,93]
Example1
#include
usingnamespacestd;
structET
{
intxx;
};
voidquickSort(ETA[],ints,intt)
{
inti=s,j=t;
ETx=A[s];
do
{
do
{
i++;
}while(A[i].xxdo
{
j--;
}while(A[j].xx>x.xx);
if(i{
ETtemp=A[i];
A[i]=A[j];
A[j]=temp;
}
}while(iA[s]=A[j];
A[j]=x;
if(squickSort(A,s,j);
if(j+1quickSort(A,j+1,t);
}
voiddisplay(ETs[],intn)
{
for(inti=0;i{
cout.width(6);
cout<
}
cout<}
intposistion(ETa[],intfirst,intend)
{
inti=first;
intj=end;
ETx;
while(i{
while(i{
i++;
}
while(i{
j--;
}
if(i{
x=a[i];
a[i]=a[j];
a[j]=x;
}
}
returni;
}
voidquickSort1(ETA[],intfirst,intend)
{
if(first>end)
{
return;
}
else
{
intp=posistion(A,first,end);
quickSort1(A,first,p-1);
quickSort1(A,p+1,end);
}
}
void_print(char*s)
{
cout<<"\n=============="<
}
voidmain()
{
ETa[10];
a[0].xx=100;
a[1].xx=30;
a[2].xx=300;
a[3].xx=20;
a[4].xx=100;
a[5].xx=50;
a[6].xx=100;
a[7].xx=30;
a[8].xx=100;
a[9].xx=10;
/*
for(inti=0;i<10;i++)
{
a[i].xx=rand()/100;
}
*/
_print("排序前");
display(a,10);
_print("排序后");
quickSort1(a,0,10);
//quickSort(a,0,10);
display(a,10);
}
Example2
#include
usingnamespacestd;
structST
{
intno;
char*name;
char*sex;
intscore;
};
voiddisplay(STs[],intn)
{
for(inti=0;i{
cout.width(3);
cout<
cout.width(15);
cout<
cout.width(5);
cout<
cout.width(6);
cout<
}
cout<}
intposistion(STa[],intfirst,intend)
{
inti=first;
intj=end;
STx;
while(i{
while(i{
i++;
}
while(i{
j--;
}
if(i{
x=a[i];
a[i]=a[j];
a[j]=x;
}
}
returni;
}
voidquickSort1(STA[],intfirst,intend)
{
if(first>end)
{
return;
}
else
{
intp=posistion(A,first,end);
quickSort1(A,first,p-1);
quickSort1(A,p+1,end);
}
}
intposistion2(STa[],intfirst,intend)
{
inti=first;
intj=end;
STx;
while(i{
while(i{
i++;
}
while(i{
j--;
}
if(i{
x=a[i];
a[i]=a[j];
a[j]=x;
}
}
returni;
}
voidquickSort2(STA[],intfirst,intend)
{
if(first>end)
{
return;
}
else
{
intp=posistion2(A,first,end);
quickSort2(A,first,p-1);
quickSort2(A,p+1,end);
}
}
void_print(char*s)
{
cout<<"\n=============="<
}
voidmain()
{
STa[8];
a[0].no=100;a[0].name="BillGates";a[0].sex="男";a[0].score=100;
a[1].no=21;a[1].name="FFGates";a[1].sex="女";a[1].score=98;
a[2].no=34;a[2].name="LucyGates";a[2].sex="男";a[2].score=77;
a[3].no=56;a[3].name="JackGates";a[3].sex="男";a[3].score=88;
a[4].no=12;a[4].name="GGGates";a[4].sex="女";a[4].score=66;
a[5].no=35;a[5].name="BBGates";a[5].sex="男";a[5].score=99;
a[6].no=11;a[6].name="KKGates";a[6].sex="男";a[6].score=78;
a[7].no=9;a[7].name="PPGates";a[7].sex="男";a[7].score=99;
_print("排序前");
display(a,8);
_print("按学号排序");
quickSort1(a,0,8);
display(a,8);
_print("按学分排序");
quickSort2(a,0,8);
display(a,8);
}
2、归并排序(MergeSorting)(稳定排序)
二路归并排序:
首先把排序区间A[0]~A[n-1]中的每一个元素看成是一个有序表,接着两两归并,等到新的有序表,如此进行,最后得到一个有序表,排序完成。
T(n)=O(nlog2n).
A={45,53,18,36,72,30,48,93,15,36}
[45],[53],[18],[36],[72],[30],[48],[93],[15],[36]
[45,53],[18,36],[30,72],[48,93],[15,36]
[18,36,45,53],[30,48,72,93],[15,36]
[18,30,36,45,48,53,72,93],[15,36]
[15,18,30,36,36,45,48,53,72,93]
Example1
#include
usingnamespacestd;
structET
{
intxx;
};
voidtwoMerge(ETA[],ETR[],ints,intm,intt)
{
inti=s,j=m+1,k=s;
while(i<=m&&j<=t)
{
if(A[i].xx<=A[j].xx)
{
R[k]=A[i];i++;k++;
}
else
{
R[k]=A[j];j++;k++;
}
}
while(i<=m)
{
R[k]=A[i];i++;k++;
}
while(j<=t)
{
R[k]=A[j];j++;k++;
}
}
voidmergePass(ETA[],ETR[],intn,intlen)
{
inti,p=0;
while(p+2*len-1<=n-1)
{
twoMerge(A,R,p,p+len-1,p+2*len-1);
p+=2*len;
}
if(p+len-1twoMerge(A,R,p,p+len-1,n-1);
else
for(i=p;i<=n-1;i++)
R[i]=A[i];
}
voidmergeSort(ETA[],intn)
{
ET*R=(ET*)malloc(n*sizeof(ET));
intlen=1;
while(len{
mergePass(A,R,n,len);
len*=2;
mergePass(R,A,n,len);
len*=2;
}
free(R);
}
voiddisplay(ETaa[],intn,char*ss)
{
cout<<"\n";
for(inti=0;i<25;i++)
cout<<"=";
cout<for(inti2=0;i2<25;i2++)
cout<<"=";
cout<<"\n";
for(inti1=0;i1{
cout.width(5);
cout<}
cout<<"\n\n";
}
voidmain()
{
ETa[10];
for(inti=0;i<10;i++)
{
a[i].xx=rand()/1000;
}
display(a,10,"排序前");
mergeSort(a,10);
display(a,10,"排序后");
}
Example2
#include
usingnamespacestd;
structET
{
intno;
char*name;
char*sex;
intscore;
};
voidtwoMerge(ETA[],ETR[],ints,intm,intt)
{
inti=s,j=m+1,k=s;
while(i<=m&&j<=t)
{
if(A[i].no<=A[j].no)
{
R[k]=A[i];i++;k++;
}
else
{
R[k]=A[j];j++;k++;
}
}
while(i<=m)
{
R[k]=A[i];i++;k++;
}
while(j<=t)
{
R[k]=A[j];j++;k++;
}
}
voidmergePass(ETA[],ETR[],intn,intlen)
{
inti,p=0;
while(p+2*len-1<=n-1)
{
twoMerge(A,R,p,p+len-1,p+2*len-1);
p+=2*len;
}
if(p+len-1twoMerge(A,R,p,p+len-1,n-1);
else
for(i=p;i<=n-1;i++)
R[i]=A[i];
}
voidmergeSort(ETA[],intn)
{
ET*R=(ET*)malloc(n*sizeof(ET));
intlen=1;
while(len{
mergePass(A,R,n,len);
len*=2;
mergePass(R,A,n,len);
len*=2;
}
free(R);
}
voiddisplay(ETs[],intn,char*ss)
{
cout<<"============="<for(inti=0;i{
cout.width(3);cout<
cout.width(15);cout<
cout.width(5);cout<
cout.width(6);cout<
}
cout<}
voidmain()
{
ETa[10];
a[0].no=10;a[0].name="BillGates";a[0].sex="男";a[0].score=100;
a[1].no=21;a[1].name="FFGates";a[1].sex="女";a[1].score=98;
a[2].no=34;a[2].name="LucyGates";a[2].sex="男";a[2].score=77;
a[3].no=56;a[3].name="JackGates";a[3].sex="