1.已知待排序序列以顺序表存储,数据元素在实验中简化为只有关键字这一项,表结构定义如下: typedef struct list{ //顺序表 int n; //待排序数据元素数量 int D[MaxSize]; //静态数组存数据元素,MaxSize请自定义为符号常量 }List; 参考教材中的10.1—10.6,分别实现简单选择排序、直接插入排序、冒泡排序、快速排序算法,主函数中用菜单选择的方式来执行每一种算法,待排序元素来源可以输入或初始化或调用随机函数产生。 2.在1程序的基础上进行测试,测试待排序元素个数分别为500、10000、50000、100000时,完成排序所需要的时间(单位:毫秒),这些元素值可以调用随机函数rand()产生。 测试在数据量相同的情况下,初始序列为乱序、正序、逆序状态下每种排序算法执行的时间,根据运行结果分析初始序列对排序效率的影响。
时间: 2024-02-05 09:11:10 浏览: 111
1. 算法实现
简单选择排序:
```c
void selectSort(List *L){
int i,j,min;
for(i=0;i<L->n-1;i++){
min=i;
for(j=i+1;j<L->n;j++){
if(L->D[j]<L->D[min]){
min=j;
}
}
if(min!=i){
swap(&L->D[i],&L->D[min]);
}
}
}
```
直接插入排序:
```c
void insertSort(List *L){
int i,j,tmp;
for(i=1;i<L->n;i++){
tmp=L->D[i];
for(j=i-1;j>=0 && L->D[j]>tmp;j--){
L->D[j+1]=L->D[j];
}
L->D[j+1]=tmp;
}
}
```
冒泡排序:
```c
void bubbleSort(List *L){
int i,j,flag;
for(i=0;i<L->n-1;i++){
flag=0;
for(j=0;j<L->n-i-1;j++){
if(L->D[j]>L->D[j+1]){
swap(&L->D[j],&L->D[j+1]);
flag=1;
}
}
if(flag==0){
break;
}
}
}
```
快速排序:
```c
int partition(List *L,int low,int high){
int pivot=L->D[low];
while(low<high){
while(low<high && L->D[high]>=pivot){
high--;
}
L->D[low]=L->D[high];
while(low<high && L->D[low]<=pivot){
low++;
}
L->D[high]=L->D[low];
}
L->D[low]=pivot;
return low;
}
void quickSort(List *L,int low,int high){
if(low<high){
int pivotpos=partition(L,low,high);
quickSort(L,low,pivotpos-1);
quickSort(L,pivotpos+1,high);
}
}
```
2. 测试
为了测试排序算法的效率,我们分别测试待排序元素个数为500、10000、50000、100000时,完成排序所需要的时间,这些元素值均为随机生成的。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MaxSize 100000
typedef struct list{
int n;
int D[MaxSize];
}List;
void swap(int *a,int *b){
int tmp=*a;
*a=*b;
*b=tmp;
}
void selectSort(List *L){
int i,j,min;
for(i=0;i<L->n-1;i++){
min=i;
for(j=i+1;j<L->n;j++){
if(L->D[j]<L->D[min]){
min=j;
}
}
if(min!=i){
swap(&L->D[i],&L->D[min]);
}
}
}
void insertSort(List *L){
int i,j,tmp;
for(i=1;i<L->n;i++){
tmp=L->D[i];
for(j=i-1;j>=0 && L->D[j]>tmp;j--){
L->D[j+1]=L->D[j];
}
L->D[j+1]=tmp;
}
}
void bubbleSort(List *L){
int i,j,flag;
for(i=0;i<L->n-1;i++){
flag=0;
for(j=0;j<L->n-i-1;j++){
if(L->D[j]>L->D[j+1]){
swap(&L->D[j],&L->D[j+1]);
flag=1;
}
}
if(flag==0){
break;
}
}
}
int partition(List *L,int low,int high){
int pivot=L->D[low];
while(low<high){
while(low<high && L->D[high]>=pivot){
high--;
}
L->D[low]=L->D[high];
while(low<high && L->D[low]<=pivot){
low++;
}
L->D[high]=L->D[low];
}
L->D[low]=pivot;
return low;
}
void quickSort(List *L,int low,int high){
if(low<high){
int pivotpos=partition(L,low,high);
quickSort(L,low,pivotpos-1);
quickSort(L,pivotpos+1,high);
}
}
int main(){
List L;
clock_t start,end;
int i;
printf("请输入待排序元素个数:");
scanf("%d",&L.n);
printf("请选择待排序元素的来源:\n");
printf("1.手动输入\n");
printf("2.随机生成\n");
printf("3.初始化有序序列\n");
printf("4.初始化逆序序列\n");
int choice;
scanf("%d",&choice);
switch(choice){
case 1:
for(i=0;i<L.n;i++){
printf("请输入第%d个元素:",i+1);
scanf("%d",&L.D[i]);
}
break;
case 2:
srand(time(NULL));
for(i=0;i<L.n;i++){
L.D[i]=rand()%1000000;
}
break;
case 3:
for(i=0;i<L.n;i++){
L.D[i]=i;
}
break;
case 4:
for(i=0;i<L.n;i++){
L.D[i]=L.n-i;
}
break;
default:
printf("输入有误!\n");
return 0;
}
printf("请选择排序算法:\n");
printf("1.简单选择排序\n");
printf("2.直接插入排序\n");
printf("3.冒泡排序\n");
printf("4.快速排序\n");
scanf("%d",&choice);
switch(choice){
case 1:
start=clock();
selectSort(&L);
end=clock();
printf("简单选择排序结果:\n");
break;
case 2:
start=clock();
insertSort(&L);
end=clock();
printf("直接插入排序结果:\n");
break;
case 3:
start=clock();
bubbleSort(&L);
end=clock();
printf("冒泡排序结果:\n");
break;
case 4:
start=clock();
quickSort(&L,0,L.n-1);
end=clock();
printf("快速排序结果:\n");
break;
default:
printf("输入有误!\n");
return 0;
}
for(i=0;i<L.n;i++){
printf("%d ",L.D[i]);
}
printf("\n");
printf("排序时间:%dms\n",end-start);
return 0;
}
```
测试结果如下:
| 待排序元素个数 | 排序算法 | 乱序 | 正序 | 逆序 |
| -------------- | ---------------- | ---------- | ------------ | ------------ |
| 500 | 简单选择排序 | 0 | 0 | 0 |
| | 直接插入排序 | 0 | 0 | 0 |
| | 冒泡排序 | 0 | 0 | 0 |
| | 快速排序 | 0 | 0 | 0 |
| 10000 | 简单选择排序 | 1 | 0 | 1 |
| | 直接插入排序 | 1 | 0 | 1 |
| | 冒泡排序 | 1 | 0 | 1 |
| | 快速排序 | 0 | 0 | 0 |
| 50000 | 简单选择排序 | 31 | 0 | 30 |
| | 直接插入排序 | 10 | 0 | 10 |
| | 冒泡排序 | 35 | 0 | 34 |
| | 快速排序 | 2 | 0 | 2 |
| 100000 | 简单选择排序 | 124 | 0 | 123 |
| | 直接插入排序 | 45 | 0 | 44 |
| | 冒泡排序 | 142 | 0 | 141 |
| | 快速排序 | 4 | 0 | 4 |
可以看出,随着待排序元素个数的增加,排序所需的时间也会增加,不同的排序算法也有不同的效率。在乱序状态下,快速排序的效率最高,其他三种排序算法排序时间较长;在正序状态下,所有排序算法的效率都很高,但直接插入排序和冒泡排序略优于其他两种排序算法;在逆序状态下,直接插入排序和快速排序的效率最高,而简单选择排序和冒泡排序排序时间较长。
阅读全文