各种内排序算法的实现及性能的比较Word格式文档下载.docx
- 文档编号:19156153
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:24
- 大小:308.51KB
各种内排序算法的实现及性能的比较Word格式文档下载.docx
《各种内排序算法的实现及性能的比较Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《各种内排序算法的实现及性能的比较Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
将初始序列(A[0]~A[n-1])作为待排序序列,第一趟在待排序序列(A[0]~A[n-1])中找最小元素,与该序列中第一个元素A[0]交换,这样子序列(A[0])有序,下一趟排序在带牌子序列(A[1]~A[n-1])中进行。
第i趟排序子序列(A[i-1]~A[n-1])中进行。
经过n-1趟排序后使得初始序列有序。
程序流程图:
②直接插入排序:
一个元素插入到有序表中,首先将其存入临时变量temp,然后从后往前查找插入位置。
当temp小于表中元素时,就将该元素后移一个位置,继续比较、移动,直到temp大于等于表中元素或者到了有序表的第一个元素结束,这时就可将temp存入刚后移的元素的位置了。
③冒泡排序:
第一趟在序列(A[0]~A[n-1])中从前往后进行两个相邻元素的比较,若后者小,则交换,比较n-1次;
第一趟排序结束,最大元素被交换到A[n-1]中(即沉底)下一趟排序只需在子序列(A[0]~A[n-2])中进行;
如果在某一趟排序中未进行交换元素,说明子序列已经有序,则不再进行下一趟排序。
④快速排序:
取第一个元素作为分割元素,初始化i=left,j=right+1,i从左往右寻找第一个大于等于分割元素的元素,j从右往左找第一个小于等于分割元素的元素并交换,i和j继续移动,重复上述步骤,直到当i>
=j时将j与第一个元素交换。
⑤两路合并排序:
将有n个元素的序列看成是n个长度为1的有序子序列,然后两两合并子序列,得到[n/2]个长度为2或1的有序子序列,再两两合并…直到得到一个长度为n的有序序列时结束。
四、程序代码
selectsort.h
#include<
iostream.h>
//简单选择排序
template<
classT>
voidSelectSort(TA[],intn)
{
intsmall;
for(inti=0;
i<
n-1;
i++){
small=i;
for(intj=i+1;
j<
n;
j++)
if(A[j]<
A[small])small=j;
Swap(A[i],A[small]);
}
Insertsort.h
//直接插入排序
voidInsertSort(TA[],intn)
for(inti=1;
i++){
intj=i;
Ttemp=A[i];
while(j>
0&
&
temp<
A[j-1]){
A[j]=A[j-1];
j--;
}
A[j]=temp;
}
}/*ok!
*/
Bubblesort.h
voidBubbleSort(TA[],intn)
inti,j,last;
i=n-1;
while(i>
0){
last=0;
for(j=0;
i;
if(A[j+1]<
A[j]){
Swap(A[j],A[j+1]);
last=j;
}
i=last;
Quicksort.h
//改进的快速排序
template<
voidquick(TA[],intn)
{
int*a;
inttop=0,right,left,j;
a=newint[n];
if(a==NULL)return;
a[top++]=0;
a[top++]=n-1;
//lc
for(j=0;
a[j]!
=NULL;
j++)
{
left=a[j++];
right=a[j];
if(left>
right)
Swap(left,right);
if(right-left<
15)
InsertSortExt(A,left,right);
else
{
a[top++]=left;
a[top++]=QuickSort(A,left,right)-1;
a[top++]=a[top-2]+2;
a[top++]=right;
intQuickSort(TA[],intleft,intright)
inti,j;
if(left<
right){
i=left;
j=right+1;
do{
doi++;
while(A[i]<
A[left]);
doj--;
while(A[j]>
if(i<
j)Swap(A[i],A[j]);
}while(i<
j);
Swap(A[left],A[j]);
returnj;
return0;
voidInsertSortExt(TA[],intleft,intright)
for(inti=left+1;
right;
while(j>
0&
temp<
A[j-1]){
j--;
Mergesort.h
//两路合并的C++程序
voidMerge(TA[],inti1,intj1,inti2,intj2)
T*Temp=newT[j2-i1+1];
inti=i1,j=i2,k=0;
while(i<
=j1&
=j2)
if(A[i]<
=A[j])Temp[k++]=A[i++];
elseTemp[k++]=A[j++];
=j1)Temp[k++]=A[i++];
while(j<
=j2)Temp[k++]=A[j++];
for(i=0;
i<
k;
i++)A[i1++]=Temp[i];
delete[]Temp;
//合并排序的C++程序
voidMergeSort(TA[],intn)
inti1,j1,i2,j2;
intsize=1;
while(size<
n){
i1=0;
while(i1+size<
i2=i1+size;
j1=i2-1;
if(i2+size-1>
n-1)
j2=n-1;
elsej2=i2+size-1;
Merge(A,i1,j1,i2,j2);
i1=j2+1;
size*=2;
Meau.h
stdio.h>
stdlib.h>
time.h>
#include"
selectsort.h"
insertsort.h"
bubblesort.h"
quicksort.h"
mergesort.h"
#defineSIZE400
#defineTIMES1000
classMenu
public:
voidprintmenu();
voidselectsort();
voidinsertSort();
voidbubbleSort();
//冒泡排序
voidquickSort();
//快速排序
voidmergeSort();
//两路合并排序
voidchildmenu();
//子菜单1
voidchildmenu2();
//子菜单2
voidswitcha();
private:
inta,b,c;
};
voidMenu<
T>
:
printmenu()
cout<
<
"
-------------------------------内排序测试系统-------------------------------"
endl;
"
endl<
1.简单选择排序"
2.直接插入排序"
3.冒泡排序"
4.快速排序"
5.两路合并排序"
6.退出"
this->
switcha();
childmenu()
cout<
--------------------------------------------------------"
1.最好情况"
2.最坏情况"
3.平均情况"
4.返回主菜单"
cin>
>
b;
if(b==4)this->
printmenu();
childmenu2()
1.原始算法"
2.改进算法"
3.返回主菜单"
c;
if(c==3)this->
switcha()
//cout<
ok"
a;
switch(a)
case1:
this->
selectsort();
break;
//ok
case2:
insertSort();
case3:
bubbleSort();
case4:
quickSort();
case5:
mergeSort();
case6:
exit
(1);
default:
cout<
error"
voidprintout(TA[],intn)//打印数组,测试时用
for(inti=0;
i++)
A[i]<
;
T*producedate(intx)//产生顺序,逆序,随机的数组
inti;
T*A=newT[SIZE];
switch(x)
for(i=0;
SIZE;
i++)A[i]=i;
returnA;
//顺序
break;
for(i=SIZE;
i>
0;
i--)A[i-1]=SIZE-i;
//逆序
srand(time(NULL));
i++){A[i]=rand()%1000+1;
}returnA;
//随机
voidSwap(T&
a,T&
b)//交换2个元素
Ttemp=a;
a=b;
b=temp;
bubbleSort()
冒泡排序"
this->
childmenu();
T*A;
doubleduration;
clock_tstart,finish;
start=clock();
TIMES;
A=producedate<
(b);
BubbleSort(A,SIZE);
delete[]A;
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
//printout(A,SIZE);
用时:
duration<
system("
pause"
);
//delete[]A;
}/*ok*/
insertSort()
直接插入排序"
//A=producedate<
//if(A==NULL){cout<
delete[]A;
InsertSort(A,SIZE);
mergeSort()
//this->
合并排序"
直接用随机数据测试"
(3);
MergeSort(A,SIZE);
quickSort()
childmenu2();
if(c==1)
原始快速排序"
start=clock();
for(inti=0;
A=producedate<
quick(A,SIZE);
delete[]A;
finish=clock();
duration=(double)(finish-start)/CLOCKS_PER_SEC;
elseif(c==2)
改进的快速排序"
/*A=producedate<
printout(A,SIZE);
quick(A,SIZE);
delete[]A;
*/
//T*A;
quick(A,SIZE);
else{cout<
selectsort()
简单选择排序"
SelectSort(A,SIZE);
Mymain.cpp
Menu.h"
intmain()
Menu<
int>
MenuObj;
MenuObj.printmenu();
okend."
五、实验结果
六、实验小结
(1)在编写此次程序时要熟练运用函数的递归套用
(2)在进行输入时,一定要细心,少犯没有分号,括号数目不对等低级错误,这会大大增加调试的时间。
(3)采用模块化思想,主函数尽量只放函数调用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 各种 排序 算法 实现 性能 比较