这段时间在温故一些常见的排序算法,顺手便把常见的一些比较着名的排序算法对同一个目标样本做了个比较。样本存于文件中, 可以根据需要进行替换。我调试的数据量较小,发现简单算法(冒泡,选择,插入)中差异相对明显,令人诧异的是改进算法中归并排序算法的效率比其他算法效率足足低了一个一个数量级…是样本量小影响了归并排序效率还是实现归并排序是我的代码出了问题呢?…我会在接下来的学习中进一步深究,同时也欢迎各位盆友提出自己的高见。
接下来上代码,包括所有排序算法和比较逻辑的实现,不到500行,也不算大。
//
// main.c
// sort_compare
//
// Created by tianling on 14-3-21.
// Copyright (c) 2014年 tianling. All rights reserved.
// 简单实现几种排序算法之间的效率比较
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int MAXSIZE = 250;//定义排序样本最大长度
/*
**定义存放样本数据的结构体
*/
typedef struct data{
int dataArray[MAXSIZE];//定义临时存放排序样本的数组
int length;
}dataArray;
typedef int status;
/*
**函数声明
*/
void arrayBegin(dataArray *array);
void bubbleSort(dataArray *array);
void printArray(dataArray *array);
void selectSort(dataArray *array);
void insertSort(dataArray *array);
void shellSort(dataArray *array);
void heapSort(dataArray *array);
void heapAdjust(dataArray *array,int i,int length);
void mergeSort(dataArray *array,dataArray *temArray,int s,int t);
void merge(dataArray *array1,dataArray *array2,int i,int m,int n);
void quickSort(dataArray *array);
void Qsort(dataArray *array,int low,int high);
int Partition(dataArray *array,int low,int high);
status tableList();
status main(int argc, const char * argv[])
{
int choose;
dataArray array;
clock_t start_time,end_time;
double work_time;
arrayBegin(&array);
printf("初始数据:\n");
printArray(&array);
choose = tableList();
while (choose != 0) {
switch(choose){
case 1:
start_time = clock();//获取程序开始运算时间
bubbleSort(&array);
end_time = clock();//获取程序结束运算时间
work_time = (double)end_time - start_time;//计算程序运算时间
printArray(&array);
printf("运行时间 %lf ms \n",work_time);
/*重新构造目标样本*/
arrayBegin(&array);
break;
case 2:
start_time = clock();
selectSort(&array);
end_time = clock();
work_time = (double)end_time - start_time;
printArray(&array);
printf("运行时间 %lf ms \n",work_time);
arrayBegin(&array);
break;
case 3:
start_time = clock();
insertSort(&array);
end_time = clock();
work_time = (double)end_time - start_time;
printArray(&array);
printf("运行时间 %lf ms \n",work_time);
arrayBegin(&array);
break;
case 4:
start_time = clock();
shellSort(&array);
end_time = clock();
work_time = (double)end_time - start_time;
printArray(&array);
printf("运行时间 %lf ms \n",work_time);
arrayBegin(&array);
break;
case 5:
start_time = clock();
heapSort(&array);
end_time = clock();
work_time = (double)end_time - start_time;
printArray(&array);
printf("运行时间 %lf ms \n",work_time);
arrayBegin(&array);
break;
case 6:
start_time = clock();
mergeSort(&array, &array, 0, 49);
end_time = clock();
work_time = (double)end_time - start_time;
printArray(&array);
printf("运行时间 %lf ms \n",work_time);
arrayBegin(&array);
break;
case 7:
start_time = clock();
quickSort(&array);
end_time = clock();
work_time = (double)end_time - start_time;
printArray(&array);
printf("运行时间 %lf ms \n",work_time);
arrayBegin(&array);
break;
default:
exit(0);
break;
}
choose = tableList();
}
return 0;
}
/*
**初始化目标序列
*/
void arrayBegin(dataArray *array){
int i = 0,temp;
FILE *file;
//从文本中读取排序样本
if((file = fopen("/Users/tianling/Documents/Data_Structure/sort_compare/sort_compare/data.txt","r")) == NULL){
printf("文件读取失败!");
return;
}
array->length = 0;//初始化目标样本长度
while((fscanf(file,"%d",&temp)) != EOF ){
array->dataArray[i] = temp;
i++;
array->length++;
}
fclose(file);//关闭文件
}
/*
**冒泡法排序
*/
void bubbleSort(dataArray *array){
int i,j,change;
for(i = 0;i<array->length;i++){
for(j = array->length-2;j>=i;j--){
if(array->dataArray[j]>array->dataArray[j+1]){
change = array->dataArray[j];
array->dataArray[j] = array->dataArray[j+1];
array->dataArray[j+1] = change;
}
}
}
}