关于各个排序算法的问题,我是想生成随机数然后计算排序时间,请问哪里出错了
请问快速排序哪里有问题程序代码:
#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编辑过]