关于各个排序算法的问题,我是想生成随机数然后计算排序时间,请问哪里出错了
请问快速排序哪里有问题
程序代码:#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<time.h>
#define size 3000
typedef int KeyType;
typedef int InfoType;
typedef struct{
KeyType key;
InfoType otherinfo;
}RecType;
typedef struct{
RecType r[size+1];
}SeqList;
void InsertSort(SeqList L){
int i,j;
for (i=2;i<=size;++i)
if (L.r[i].key<L.r[i-1].key) // L.r[i]与有序表的最后一个元素比较,若L.r[i]较小则插入有序子表内,若较大则保持当前位置
{
L.r[0]= L.r[i]; //先将待插入的元素放入“哨兵”位置
L.r[i]= L.r[i-1]; //子表最后一个元素开始后移一位
for (j=i-2;L.r[0].key<L.r[j].key; --j)
L.r[j+1]= L.r[j]; //从子表的后往前比较,只要元素比哨兵大就不断后移
L.r[j+1]= L.r[0]; //直到子表元素小于哨兵,将哨兵值送入当前要插入的位置(包括插入到表首)
}
// printf("\n输出的直插排序的序列为:\n");
// for(i=1;i<=size;i++)
// printf("%d ",L.r[i].key);
// printf("\n");
}
void BInsertSort(SeqList L){
int i,j,low,high,mid;
for(i=2;i<=size;++i){
L.r[0]=L.r[i];
low=1;high=i-1;
while(low<=high){
mid=(low+high)/2;
if(L.r[i].key<L.r[mid].key)
high=mid-1;
else
low=mid+1;
}
for(j=i-1;j>=high+1;--j)
L.r[j+1]=L.r[j];
L.r[high+1]=L.r[0];
}
// printf("\n输出的折半排序的序列为:\n");
// for(i=1;i<=size;i++)
// printf("%d ",L.r[i].key);
// printf("\n");
}
void ShellInsert(SeqList L,int n){
int i,j,dk;
for(dk=n/2;dk>0;dk/=2){//步长的选取
for(i=1+dk;i<=size;i++)
if(L.r[i].key<L.r[i-dk].key){
L.r[0]=L.r[i];
for(j=i-dk;j>0&&(L.r[0].key<L.r[j].key);j-=dk)
L.r[j+dk]=L.r[j];
L.r[j+dk]=L.r[0];
}
}
// printf("\n输出的希尔排序的序列为:\n");
// for(i=1;i<=size;i++)
// printf("%d ",L.r[i].key);
// printf("\n");
}
void BubbleSort(SeqList L){
int i,j;
int exchange=1;
for(i=1;i<=size;i++){ //n-1趟
exchange=0;
for(j=1;j<=size-i;j++)//每次会选出一个最大值放在最后,因此每趟排序比较个数递减
if(L.r[j].key>L.r[j+1].key){
L.r[0]=L.r[j];L.r[j]=L.r[j+1];L.r[j+1]=L.r[0];
exchange=1;
}
if (!exchange)
break;
}
// printf("\n输出的冒泡排序的序列为:\n");
// for(i=1;i<=size;i++)
// printf("%d ",L.r[i].key);
// printf("\n");
}
int Partition(SeqList &L,int low,int high){
SeqList pivotkey;
L.r[0]=L.r[low];
pivotkey.r[0]=L.r[low];
while(low<high){
while(low<high&&L.r[high].key>=pivotkey.r[0].key)
--high;
L.r[low]=L.r[high];
while(low<high&&L.r[low].key<=pivotkey.r[0].key)
++low;
L.r[high]=L.r[low];
}
L.r[low]=L.r[0]; //支点记录到位;
return low; //返回支点记录所在位置。
}
void QuickSort (SeqList &L,int low,int high){
int pivot;
if(low<high)
{
pivot=Partition(L,low,high);
QuickSort(L,low,pivot-1);
QuickSort(L,pivot+1,high);
}
}
void SelectSort(SeqList L)
{
int i,j,k;
for(i=1;i<size;i++) { //做第i趟排序(1≤i≤n-1)
k=i;
for(j=i+1;j<=size;j++)//在R[i..n]中选key最小的记录R[k]
if(L.r[j].key<L.r[k].key)
k=j; //k记下目前找到的最小关键字所在的位置
if(k!=i) //交换R[i]和R[k]
{
L.r[0]=L.r[i]; L.r[i]=L.r[k];L.r[k]=L.r[0];
}
}
// printf("\n输出的简单选择排序的序列为:\n");
// for(i=1;i<=size;i++)
// printf("%d ",L.r[i].key);
// printf("\n");
}
void main(){
SeqList p;
int i;
double start,end,duration;
srand((unsigned)time(NULL));
for(i=1;i<size+1;i++)
p.r[i].key=rand()%100;
start=clock();
InsertSort(p);
end=clock();
duration=end-start;
printf("\n直插排序运行时间为:%f",duration);
start=clock();
BInsertSort(p);
end=clock();
duration=end-start;
printf("\n折半排序运行时间为:%f",duration);
start=clock();
ShellInsert(p,size);
end=clock();
duration=end-start;
printf("\n希尔排序运行时间为:%f",duration);
start=clock();
BubbleSort(p);
end=clock();
duration=end-start;
printf("\n冒泡排序运行时间为:%f",duration);
start=clock();
QuickSort(p,1,size);
end=clock();
duration=end-start;
printf("\n快速排序运行时间为:%f",duration);
// printf("\n输出的快速排序的序列为:\n");
// for(i=1;i<=size;i++)
// printf("%d ",q.r[i].key);
// printf("\n");
start=clock();
SelectSort(p);
end=clock();
duration=end-start;
printf("\n选择排序运行时间为:%f\n",duration);
}
[此贴子已经被作者于2017-5-3 18:13编辑过]






