计算机软件试验七 排序
- 格式:doc
- 大小:32.00 KB
- 文档页数:3
实验七排序
算法:
1、快速排序:基本思想是任取待排序对象序列中的某个对象 (例如取第一个对象) 作
为基准,按照该对象的关键字大小,将整个对象序列划分为左右两个子序列:左侧子序列中所有对象的关键字都小于或等于基准对象的关键字,右侧子序列中所有对象的关键字都大于基准对象的关键字。
基准对象则排在这两个子序列中间(这也是该对象最终应安放的位置然后分别对这两个子序列重复施行上述方法,直到所有的对象都排在相应位置上为止
2、二路归并排序:假设初始对象序列有n 个对象,首先把它看成是n 个长度为 1 的
有序子序列 (归并项),先做两两归并,得到⎡n / 2⎤个长度为 2 的归并项 (如果n 为奇数,则最后一个有序子序列的长度为1);再做两两归并,…,如此重复,最后得到一个长度为n 的有序序列
程序:
//快速排序
void quicksort(int r[],int left,int right)
{
int i,j;
int swap;
i=left;
j=right;
swap=r[left];
while(i<j)
{
while(i<j&&swap<r[j])
j--;
if(i<j)
{r[i]=r[j];
i++;}
while(i<j&&r[i]<swap)
i++;
if(i<j)
{r[j]=r[i];
j--;}
}
r[i]=swap;
if(left<i)
quicksort(r,left,i-1);
if(i<right)
quicksort(r,i+1,right);
}
//二路归并排序由你完成
void merge(int r[],int r1[],int low,int mid,int high)
{
int low,mid,high;
int i,j,k;
int i=low;
j=mid+1;
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++];
}
void mergepass(int r[],int r1[],int length)
{
int length;
int i=0,j;
while(i+2*length<=n)
{
merge(r,r1,i,i+length-1,i+2*length-1)
i=i+2*length;}
if(i+length-1<n-1)
merge(r,r1,i,i+length-1,n-1);
else
for(j=i;j<n;j++)
r1[j]=r[j];
}
void mergesort(r[])
{
int length=1;
while(length<n)
{mergepass(r,r1.length);
length=2*length;}
}
void main()
{
int i,j;
int a[1000];
srand(NULL);
for(i=1;i<=1000;i++)
a[i]=rand();
}
Bubblesort(a,1000);
quicksort(a,1,1000);
heapsort(a,1000);
mergesort(a);
for(j=1;j<=1000;j++)
cout<<a[j]<<endl;
}
调试分析:1、产生随机数时没有用srand(NULL);
2、将srand错打成stand;
3、将srand放在了循环里,导致只产生了一个随机数;
4、中英文符号弄混;
5、弄错指针移动的先后位置;
6、弄错数据移动的位置;
事件复杂度:1、插入排序的时间复杂度为 O(n2)
2、冒泡排序的平均时间复杂度为O(n2)
3、快速排序在最坏情况下的时间复杂度为O(n2)
4、归并排序时间复杂度为O(nlogn)。