排序算法
所包含的排序算法/插入0 希尔1 冒泡2 快排3 选择4 堆5 归并6 基数7/
// 排序实验
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <memory.h>
#define STR_LEN 60000//定义随机输出的数据规模。
typedef struct {
int shuju, count;
}point;//每个数据的结构
int count=0;
int n=0;
point data[1000000];
clock_t start, finish; //定义第计数器
double Total_time; //定义一个double类型的变量,用于存储时间单位
long long times[8];
double timi[10];
/*插入0 希尔1 冒泡2 快排3 选择4 堆5 归并6 基数7*/
void InsertSort(point *num, int n);//0
void ShellSort(point *num, int n);//1
void BubbleSort(point *num);//2
void QuickSort(point *num, int left, int right);//3
int AdjustAarry(point *num, int left, int right);
void SelectSort(point *num, int n) ;//4
void HeapSort(point *num, int n);//5
void AdjustHeap(point *num, int start, int end);
void MergeSort(point *num, int left, int right);//6
void merge(point *num, int left, int mid, int right);
void RadixSort(point *num, int n);//7
void Creatdata();
void readdata() ;
void judge(point *num,int n);
void write(int i) ;
void writetime();
void print(int count);
int main()
{
srand((int)time(0));
count=STR_LEN;
n=count;
for(int i = 0; i < 10; i++){
memset(times,0,sizeof(times));
Creatdata();
readdata();
printf("数据规模%d,第%d组\n",count,i+1); print(count);
InsertSort(data,count); judge(data,count);
readdata();
ShellSort(data,count);
judge(data,count);
readdata();
BubbleSort(data);
judge(data,count);
readdata();
start = clock(); //获取开始时间
QuickSort(data,1,count);
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("QuickSort:%.3fms。\n",Total_time);
timi[3]=Total_time;
judge(data,count);
readdata();
SelectSort(data,count);
judge(data,count);
readdata();
HeapSort(data,count);
judge(data,count);
readdata();
start = clock(); //获取开始时间
MergeSort(data,1,count);
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("MergeSort:%.3fms。\n",Total_time);
judge(data,count);
timi[6]=Total_time;
readdata();
RadixSort(data,count);
judge(data,count);
write(i);
writetime();
printf("Sorted:");
print(count);
printf("\n");
}
}
void InsertSort(point *num, int n) { //0:直接插入排序,从小到大 ,下标1开始有效
start = clock(); //获取开始时间
int i,j;
for(i = 2; i <= n; i++) {
times[0]++;
if(num[i].shuju< num[i-1].shuju) {
num[0].shuju = num[i].shuju;
for(j = i-1; num[j].shuju > num[0].shuju; j--) {
times[0]++;
num[j+1].shuju = num[j].shuju;
}
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("InsertSort:%.3fms\n",Total_time);
timi[0]=Total_time;
}
void ShellSort(point *num, int n) { //1:希尔排序,增量选择为2的k次方减1,从小到大,起始下标1
start = clock(); //获取开始时间
int k, s,d,i,j;
for(k = log(n)/log(2); k >= 1; k--) {
d = pow(2,k)-1;
for(s = 1; s <= d; s++) {
for(i = s+d; i <= n; i+=d) {
times[1]++;
if(num[i].shuju < num[i-d].shuju) {
num[0].shuju = num[i].shuju;
num[0].count = num[i].count;
for(j = i-d; j > 0 && num[j].shuju > num[0].shuju; j-=d) {
times[1]++;
num[j+d].shuju = num[j].shuju;
num[j+d].count = num[j].count;
}
num[j+d].shuju = num[0].shuju;
num[j+d].count = num[0].count;
}
}
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("ShellSort:%.3fms。\n",Total_time);
timi[1]=Total_time;
}
void BubbleSort(point *num) { //2:冒泡排序,从小到大,起始下标1
start = clock(); //获取开始时间
int i,j, t ,tt, f = 1;
for(i = 1; i <= n; i++) {
for(j = 1; j < n-i; j ++) {
times[2]++;
if(num[j].shuju>num[j+1].shuju) {
t = num[j].shuju;
tt=num[j].count;
num[j].shuju = num[j+1].shuju;
num[j].count= num[j+1].count;
num[j+1].shuju = t;
num[j+1].count = tt;
f = 0;
}
}
if(f) {
break;
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("BubbleSort:%.3fms。\n",Total_time);
timi[2]=Total_time;
}
int AdjustAarry(point *num, int left, int right) {//对已经选好中点的序列进行排序调整
int i = left,j = right;
num[0].shuju = num[left].shuju;
num[0].count = num[left].count;
while(i<j) {
while(i<j && num[j].shuju > num[0].shuju) {
times[3]++;
j--;
}
if(i<j) {
num[i].shuju = num[j].shuju;
num[i].count = num[j].count;
i++;
}
while(i<j && num[i].shuju < num[0].shuju) {
times[3]++;
i++;
}
if(i<j) {
num[j].shuju = num[i].shuju;
num[j].count = num[i].count;
j--;
}
}
num[i].shuju = num[0].shuju;
num[i].count = num[0].count;
return i;
}
void QuickSort(point *num, int left, int right) { //3:快速排序,从小到大,起始下标1
int m;
if(left < right) {
m = AdjustAarry(num, left, right);
QuickSort(num, left, m-1);
QuickSort(num, m+1, right);
}
}
void SelectSort(point *num, int n) {//4:选择排序
start = clock(); //获取开始时间
int i,j, t;
for(i = 1; i < n ; i++) {
t = i;
for(j = i+1; j <= n; j++) {
times[4]++;
if(num[t].shuju > num[j].shuju) {
t = j;
}
}
if(i != t) {
num[0].shuju = num[i].shuju;
num[0].count = num[i].count;
num[i].shuju = num[t].shuju;
num[i].count = num[t].count;
num[t].shuju = num[0].shuju;
num[t].count = num[0].count;
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("SelectSort:%.3f。\n",Total_time);
timi[4]=Total_time;
}
void AdjustHeap(point *num, int start, int end) {
int dad = start, son = 2*dad;
while(son <= end) {
times[5]++;
if(son+1 <= end && num[son].shuju < num[son+1].shuju) {
son++;
}
times[5]++;
if(num[dad].shuju < num[son].shuju) {
num[0].shuju = num[dad].shuju;
num[0].count = num[dad].count;
num[dad].shuju = num[son].shuju;
num[dad].count = num[son].count;
num[son].shuju = num[0].shuju;
num[son].count = num[0].count;
dad = son;
son = 2*dad;
} else {
return;
}
}
}
void HeapSort(point *num, int n) {//5:堆排序
start = clock(); //获取开始时间
int i = n;
while(i > 0) {
AdjustHeap(num, i, n);
i--;
}
for(i = 1; i < n; i++) {
num[0].shuju = num[1].shuju;
num[0].count = num[1].count;
num[1].shuju = num[n+1-i].shuju;
num[1].count = num[n+1-i].count;
num[n+1-i].shuju = num[0].shuju;
num[n+1-i].count = num[0].count;
AdjustHeap(num,1, n-i);
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("HeapSort:%.3fms。\n",Total_time);
timi[5]=Total_time;
}
void MergeSort(point *num, int left, int right) { //6:归并排序,从小到大,递归
int mid;
if(left < right) {
mid = (left + right) / 2;
MergeSort(num, left,mid);
MergeSort(num, mid+1, right);
merge(num, left, mid, right);
}
}
void merge(point *num, int left, int mid, int right) { //归并两组有序数。从小的到大
int i = left, j = mid+1, t = 0;
//int c = ;
point pt =(point *) malloc(sizeof(int) * (right - left + 1));
while(i <= mid && j <= right) {
times[6]++;
if(num[i].shuju > num[j].shuju) {
pt[t].shuju= num[j].shuju;
pt[t].count= num[j].count;
j++;
} else {
pt[t].shuju = num[i].shuju;
pt[t].count= num[i].count;
i++;
}
t++;
}
while(i <= mid) {
pt[t].shuju = num[i].shuju;
pt[t].count= num[i].count;
i++;
t++;
}
while(j <= right) {
pt[t].shuju = num[j].shuju;
pt[t].count= num[j].count;
j++;
t++;
}
t = 0;
i = left;
while(i <= right) {
num[i].shuju = pt[t].shuju;
num[i].count = pt[t].count;
i++;
t++;
}
}
void RadixSort(point *num, int n) { // 基数排序, 从小到大,下标从1开始
start = clock(); //获取开始时间
int max = num[1].shuju, i,j,k, count = 0, *temp[10];
for(i = 2; i <= n; i++) { //找最大数
if(max < num[i].shuju) {
max = num[i].shuju;
}
}
while(max) { //确定最大位数
count++;
max = max/10;
}
for(i = 0; i < 10; i++) {
temp[i] = (int *)malloc(sizeof(int) * (n+1));
temp[i][0] = 0;
}
max = 1;
while(count--) {
for(i = 1; i <= n; i++) { //分桶
temp[num[i].shuju/max%10][0]++;
temp[num[i].shuju/max%10][temp[num[i].shuju/max%10][0]] = num[i].shuju;
}
k = 1;
for(i = 0; i < 10; i++) { //合并
for(j = 1; j <= temp[i][0]; j++) {
num[k++].shuju = temp[i][j];
}
temp[i][0] = 0;
}
max *= 10;
}
for(i = 0; i < 10; i++) {
free(temp[i]);
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("RadixSort:%.3fms。\n",Total_time);
timi[7]=Total_time;
}
/*
void Creatdata(int n) // 随机生成一定规模的数据写进相关文件
{
FILE *fp=fopen("data.txt","w");
fprintf(fp,"%d\n",n);
int t;
for (int i=0;i<n-1;i++)
{
if(i==n-2) {
t=rand()%10000+1;
fprintf(fp,"%d ",t);
}
else fprintf(fp,"%d ",rand()% 10000 +1);
}
fprintf(fp,"%d\n",t);
fclose(fp);
}
*/
void Creatdata()
{
FILE* creat = fopen("data.txt", "w");
FILE* c2 = fopen("log.txt", "a");
int str[STR_LEN + 1] = { 0 };
fprintf(creat,"%d\n",STR_LEN);
int i;
for (i = 0; i < STR_LEN; i++)
{
int lenth;
srand(time(NULL));//通过时间函数设置随机数种子,使得每次运行结果随机。
do { lenth = rand() % STR_LEN; } while (lenth < 3);
str[i] = rand() % lenth + 1;
fprintf(creat, "%d ", str[i]);
}
fclose(creat);
fclose(c2);
}
void Readdata() // 从文件中读取数据 放进数组a里面
{
FILE *fp=fopen("data.txt","r");
int n=0;
fscanf(fp,"%d",&n);
memset(data,0,sizeof(data));
for (int i=1;i<=n;i++)
{
fscanf(fp,"%d",&data[i].shuju);
data[i].count=i;
}
fclose(fp);
}
void judge(point *num,int n) // 判断稳定不稳定
{
for (int i=1;i<=n-1;i++)
{
if (num[i].shuju==num[i+1].shuju&&num[i].count>num[i+1].count)
{
printf("不稳定!\n");
return ;
}
}
printf("稳定!\n");
}
void write(int i) // 写比较次数进结果文件
{
if (i==0)
{
char s[10]="w";
FILE *fp = fopen("result.txt",s);
for(int i1 = 0; i1 < 7; i1++)
fprintf(fp,"%d ",times[i1]);
fprintf(fp,"\n");
fclose(fp);
}
else {
char s[10]="a";
FILE *fp = fopen("result.txt",s);
for(int i1 = 0; i1< 7; i1++)
fprintf(fp,"%d ",times[i1]);
fprintf(fp,"\n");
fclose(fp);
}
}
void writetime() //写时间进文件
{
FILE *fp = fopen("result.txt","a");
for(int i1 = 0; i1 < 8; i1++)
fprintf(fp,"%fms ",timi[i1]);
fprintf(fp,"\n");
fclose(fp);
}
void print(int count) //把初始序列与最终序列打印到屏幕上
{
for (int j=1;j<=count;j++)
printf("%d ",data[j]);
printf("\n");
}
// 排序实验
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <memory.h>
typedef struct {
int shuju, count;
}point;
int count=0;
int n=0;
point data[1000000];
clock_t start, finish; //定义第计数器
double Total_time; //定义一个double类型的变量,用于存储时间单位
long long times[8];
double timi[10];
/*插入0 希尔1 冒泡2 快排3 选择4 堆5 归并6*/
void InsertSort(point *num, int n) { //直接插入排序,从小到大 ,下标1开始有效
start = clock(); //获取开始时间
int i,j;
for(i = 2; i <= n; i++) {
times[0]++;
if(num[i].shuju< num[i-1].shuju) {
num[0].shuju = num[i].shuju;
for(j = i-1; num[j].shuju > num[0].shuju; j--) {
times[0]++;
num[j+1].shuju = num[j].shuju;
}
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("插入使用了%f毫秒。\n",Total_time);
timi[0]=Total_time;
}
void ShellSort(point *num, int n) { //希尔排序,增量选择为2的k次方减1,从小到大,起始下标1
start = clock(); //获取开始时间
int k, s,d,i,j;
for(k = log(n)/log(2); k >= 1; k--) {
d = pow(2,k)-1;
for(s = 1; s <= d; s++) {
for(i = s+d; i <= n; i+=d) {
times[1]++;
if(num[i].shuju < num[i-d].shuju) {
num[0].shuju = num[i].shuju;
num[0].count = num[i].count;
for(j = i-d; j > 0 && num[j].shuju > num[0].shuju; j-=d) {
times[1]++;
num[j+d].shuju = num[j].shuju;
num[j+d].count = num[j].count;
}
num[j+d].shuju = num[0].shuju;
num[j+d].count = num[0].count;
}
}
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("希尔使用了%f毫秒。\n",Total_time);
timi[1]=Total_time;
}
void BubbleSort(point *num) { //冒泡排序,从小到大,起始下标1
start = clock(); //获取开始时间
int i,j, t ,tt, f = 1;
for(i = 1; i <= n; i++) {
for(j = 1; j < n-i; j ++) {
times[2]++;
if(num[j].shuju>num[j+1].shuju) {
t = num[j].shuju;
tt=num[j].count;
num[j].shuju = num[j+1].shuju;
num[j].count= num[j+1].count;
num[j+1].shuju = t;
num[j+1].count = tt;
f = 0;
}
}
if(f) {
break;
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("冒泡使用了%f毫秒。\n",Total_time);
timi[2]=Total_time;
}
int AdjustAarry(point *num, int left, int right) {
int i = left,j = right;
num[0].shuju = num[left].shuju;
num[0].count = num[left].count;
while(i<j) {
while(i<j && num[j].shuju > num[0].shuju) {
times[3]++;
j--;
}
if(i<j) {
num[i].shuju = num[j].shuju;
num[i].count = num[j].count;
i++;
}
while(i<j && num[i].shuju < num[0].shuju) {
times[3]++;
i++;
}
if(i<j) {
num[j].shuju = num[i].shuju;
num[j].count = num[i].count;
j--;
}
}
num[i].shuju = num[0].shuju;
num[i].count = num[0].count;
return i;
}
void QuickSort(point *num, int left, int right) { //快速排序,从小到大,起始下标1
int m;
if(left < right) {
m = AdjustAarry(num, left, right);
QuickSort(num, left, m-1);
QuickSort(num, m+1, right);
}
}
void SelectSort(point *num, int n) {//选择排序
start = clock(); //获取开始时间
int i,j, t;
for(i = 1; i < n ; i++) {
t = i;
for(j = i+1; j <= n; j++) {
times[4]++;
if(num[t].shuju > num[j].shuju) {
t = j;
}
}
if(i != t) {
num[0].shuju = num[i].shuju;
num[0].count = num[i].count;
num[i].shuju = num[t].shuju;
num[i].count = num[t].count;
num[t].shuju = num[0].shuju;
num[t].count = num[0].count;
}
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("选择使用了%f毫秒。\n",Total_time);
timi[4]=Total_time;
}
void AdjustHeap(point *num, int start, int end) {
int dad = start, son = 2*dad;
while(son <= end) {
times[5]++;
if(son+1 <= end && num[son].shuju < num[son+1].shuju) {
son++;
}
times[5]++;
if(num[dad].shuju < num[son].shuju) {
num[0].shuju = num[dad].shuju;
num[0].count = num[dad].count;
num[dad].shuju = num[son].shuju;
num[dad].count = num[son].count;
num[son].shuju = num[0].shuju;
num[son].count = num[0].count;
dad = son;
son = 2*dad;
} else {
return;
}
}
}
void HeapSort(point *num, int n) {//堆排序
start = clock(); //获取开始时间
int i = n;
while(i > 0) {
AdjustHeap(num, i, n);
i--;
}
for(i = 1; i < n; i++) {
num[0].shuju = num[1].shuju;
num[0].count = num[1].count;
num[1].shuju = num[n+1-i].shuju;
num[1].count = num[n+1-i].count;
num[n+1-i].shuju = num[0].shuju;
num[n+1-i].count = num[0].count;
AdjustHeap(num,1, n-i);
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("堆排序使用了%f毫秒。\n",Total_time);
timi[5]=Total_time;
}
void merge(point *num, int left, int mid, int right) { //归并两组有序数。从小的到大
int i = left, j = mid+1, t = 0;
point pt[right - left +1];
while(i <= mid && j <= right) {
times[6]++;
if(num[i].shuju > num[j].shuju) {
pt[t].shuju= num[j].shuju;
pt[t].count= num[j].count;
j++;
} else {
pt[t].shuju = num[i].shuju;
pt[t].count= num[i].count;
i++;
}
t++;
}
while(i <= mid) {
pt[t].shuju = num[i].shuju;
pt[t].count= num[i].count;
i++;
t++;
}
while(j <= right) {
pt[t].shuju = num[j].shuju;
pt[t].count= num[j].count;
j++;
t++;
}
t = 0;
i = left;
while(i <= right) {
num[i].shuju = pt[t].shuju;
num[i].count = pt[t].count;
i++;
t++;
}
}
void MergeSort(point *num, int left, int right) { //归并排序,从小到大,递归
int mid;
if(left < right) {
mid = (left + right) / 2;
MergeSort(num, left,mid);
MergeSort(num, mid+1, right);
merge(num, left, mid, right);
}
}
void RadixSort(point *num, int n) { // 基数排序, 从小到大,下标从1开始
start = clock(); //获取开始时间
int max = num[1].shuju, i,j,k, count = 0, *temp[10];
for(i = 2; i <= n; i++) { //找最大数
if(max < num[i].shuju) {
max = num[i].shuju;
}
}
while(max) { //确定最大位数
count++;
max = max/10;
}
for(i = 0; i < 10; i++) {
temp[i] = (int *)malloc(sizeof(int) * (n+1));
temp[i][0] = 0;
}
max = 1;
while(count--) {
for(i = 1; i <= n; i++) { //分桶
temp[num[i].shuju/max%10][0]++;
temp[num[i].shuju/max%10][temp[num[i].shuju/max%10][0]] = num[i].shuju;
}
k = 1;
for(i = 0; i < 10; i++) { //合并
for(j = 1; j <= temp[i][0]; j++) {
num[k++].shuju = temp[i][j];
}
temp[i][0] = 0;
}
max *= 10;
}
for(i = 0; i < 10; i++) {
free(temp[i]);
}
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("基数使用了%f毫秒。\n",Total_time);
timi[7]=Total_time;
}
void Creatdata(int n) // 随机生成一定规模的数据写进相关文件
{
FILE *fp=fopen("data.txt","w");
fprintf(fp,"%d\n",n);
int t;
for (int i=0;i<n-1;i++)
{
if(i==n-2) {
t=rand()%100+1;
fprintf(fp,"%d ",t);
}
else fprintf(fp,"%d ",rand()%100+1);
}
fprintf(fp,"%d\n",t);
fclose(fp);
}
void readdata() // 从文件中读取数据 放进数组a里面
{
FILE *fp=fopen("data.txt","r");
int n=0;
fscanf(fp,"%d",&n);
memset(data,0,sizeof(data));
for (int i=1;i<=n;i++)
{
fscanf(fp,"%d",&data[i].shuju);
data[i].count=i;
}
fclose(fp);
}
void judge(point *num,int n) // 判断稳定不稳定
{
for (int i=1;i<=n-1;i++)
{
if (num[i].shuju==num[i+1].shuju&&num[i].count>num[i+1].count)
{
printf("不稳定!\n");
return ;
}
}
printf("稳定!\n");
}
void write(int i) // 写比较次数进结果文件
{
if (i==0)
{
char s[10]="w";
FILE *fp = fopen("result.txt",s);
for(int i1 = 0; i1 < 7; i1++)
fprintf(fp,"%d ",times[i1]);
fprintf(fp,"\n");
fclose(fp);
}
else {
char s[10]="a";
FILE *fp = fopen("result.txt",s);
for(int i1 = 0; i1< 7; i1++)
fprintf(fp,"%d ",times[i1]);
fprintf(fp,"\n");
fclose(fp);
}
}
void writetime() //写时间进文件
{
FILE *fp = fopen("result.txt","a");
for(int i1 = 0; i1 < 8; i1++)
fprintf(fp,"%fms ",timi[i1]);
fprintf(fp,"\n");
fclose(fp);
}
void print(int count) //把初始序列与最终序列打印到屏幕上
{
for (int j=1;j<=count;j++)
printf("%d ",data[j]);
printf("\n");
}
int main()
{
srand((int)time(0));
printf("请选择数据规模:");
scanf("%d",&count);
n=count;
for(int i = 0; i < 10; i++){
memset(times,0,sizeof(times));
Creatdata(count);
readdata();
printf("数据规模%d,第%d组\n",count,i+1); print(count);
InsertSort(data,count); judge(data,count);
readdata(); ShellSort(data,count); judge(data,count);
readdata(); BubbleSort(data); judge(data,count);
readdata();
start = clock(); //获取开始时间
QuickSort(data,1,count);
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("快排使用了%f毫秒。\n",Total_time);
timi[3]=Total_time;
judge(data,count);
readdata(); SelectSort(data,count); judge(data,count);
readdata(); HeapSort(data,count); judge(data,count);
readdata();
start = clock(); //获取开始时间
MergeSort(data,1,count);
finish = clock(); //获取结束时间
Total_time = (double)(finish - start) / CLOCKS_PER_SEC; //单位换算,换算成毫秒
printf("归并使用了%f毫秒。\n",Total_time);
judge(data,count);
timi[6]=Total_time;
readdata(); RadixSort(data,count); judge(data,count);
write(i);
writetime();
printf("排序后:");
print(count);
printf("\n");
}
}
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
long times[8];
/*插入0希尔1冒泡2 快排3 选择4 堆5 归并6*/
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void InsertSort(int num[], int n) { //直接插入排序,从小到大 ,下标1开始有效
int i,j;
for(i = 2; i <= n; i++) {
times[0]++;
if(num[i] < num[i-1]) {
num[0] = num[i];
for(j = i-1; num[j] > num[0]; j--) {
times[0]++;
num[j+1] = num[j];
}
}
}
}
void ShellSort(int num[], int n) { //希尔排序,增量选择为2的k次方减1,从小到大,起始下标1
int k, s,d,i,j;
for(k = log(n)/log(2); k >= 1; k--) {
d = pow(2,k)-1;
printf("\nd = %5d,k = %d\n",d,k);
for(s = 1; s <= d; s++) {
for(i = s+d; i <= n; i+=d) {
times[1]++;
if(num[i] < num[i-d]) {
num[0] = num[i];
for(j = i-d; j > 0 && num[j] > num[0]; j-=d) {
times[1]++;
num[j+d] = num[j];
}
num[j+d] = num[0];
}
}
}
}
}
void BubbleSort(int num[], int n) { //冒泡排序,从小到大,起始下标1
int i,j, t , f = 1;
for(i = 1; i <= n; i++) {
for(j = 1; j < n-i; j ++) {
times[2]++;
if(num[j] >num[j+1]) {
t = num[j];
num[j] = num[j+1];
num[j+1] = t;
f = 0;
}
}
if(f) {
break;
}
}
}
int AdjustAarry(int num[], int left, int right) {
int i = left,j = right;
num[0] = num[left];
while(i<j) {
while(i<j && num[j] > num[0]) {
times[3]++;
j--;
}
if(i<j) {
num[i] = num[j];
i++;
}
while(i<j && num[i] < num[0]) {
times[3]++;
i++;
}
if(i<j) {
num[j] = num[i];
j--;
}
}
num[i] = num[0];
return i;
}
void QuickSort(int num[], int left, int right) { //快速排序,从小到大,起始下标1
int m;
if(left < right) {
m = AdjustAarry(num, left, right);
QuickSort(num, left, m-1);
QuickSort(num, m+1, right);
}
}
void SelectSort(int num[], int n) {//选择排序
int i,j, t;
for(i = 1; i < n ; i++) {
t = i;
for(j = i+1; j <= n; j++) {
times[4]++;
if(num[t] > num[j]) {
t = j;
}
}
if(i != t) {
num[0] = num[i];
num[i] = num[t];
num[t] = num[0];
}
}
}
void AdjustHeap(int num[], int start, int end) {
int dad = start, son = 2*dad;
while(son <= end) {
times[5]++;
if(son+1 <= end && num[son] < num[son+1]) {
son++;
}
times[5]++;
if(num[dad] < num[son]) {
num[0] = num[dad];
num[dad] = num[son];
num[son] = num[0];
dad = son;
son = 2*dad;
} else {
return;
}
}
}
void HeapSort(int num[], int n) {//堆排序
int i = n;
while(i > 0) {
AdjustHeap(num, i, n);
i--;
}
for(i = 1; i < n; i++) {
num[0] = num[1];
num[1] = num[n+1-i];
num[n+1-i] = num[0];
AdjustHeap(num,1, n-i);
}
}
void merge(int num[], int left, int mid, int right) { //归并两组有序数。从小的到大
int i = left, j = mid+1, *pt = NULL, t = 0;
pt = (int *)malloc(sizeof(int) * (right - left +1));
while(i <= mid && j <= right) {
times[6]++;
if(num[i] > num[j]) {
pt[t] = num[j];
j++;
} else {
pt[t] = num[i];
i++;
}
t++;
}
while(i <= mid) {
pt[t] = num[i];
i++;
t++;
}
while(j <= right) {
pt[t] = num[j];
j++;
t++;
}
t = 0;
i = left;
while(i <= right) {
num[i] = pt[t];
i++;
t++;
}
free(pt);
}
void MergeSort(int num[], int left, int right) { //归并排序,从小到大,递归
int mid;
if(left < right) {
mid = (left + right) / 2;
MergeSort(num, left,mid);
MergeSort(num, mid+1, right);
merge(num, left, mid, right);
}
}
void RadixSort(int num[], int n) { // 基数排序, 从小到大,下标从1开始
int max = num[1], i,j,k, count = 0, *temp[10];
for(i = 2; i <= n; i++) { //找最大数
if(max < num[i]) {
max = num[i];
}
}
//printf("%d",max);
while(max) { //确定最大位数
count++;
max = max/10;
}
//printf("%d",count);
for(i = 0; i < 10; i++) {
temp[i] = (int *)malloc(sizeof(int) * (n+1));
temp[i][0] = 0;
}
max = 1;
while(count--) {
for(i = 1; i <= n; i++) { //分桶
temp[num[i]/max%10][0]++;
temp[num[i]/max%10][temp[num[i]/max%10][0]] = num[i];
}
// for(i = 0; i < 10; i++){//合并
// printf("%d:",i) ;
// for(j = 1; j <= temp[i][0]; j++){
// printf("%5d",temp[i][j]) ;
// }
// printf("\n") ;
// }
k = 1;
for(i = 0; i < 10; i++) { //合并
for(j = 1; j <= temp[i][0]; j++) {
num[k++] = temp[i][j];
}
temp[i][0] = 0;
}
// for(i = 1; i <= n; i++){//找最大数
// printf("%5d", num[i]);
// }
max *= 10;
}
for(i = 0; i < 10; i++) {
free(temp[i]);
}
}
void createdata(int n) {
FILE *fp;
int data, i;
fp = fopen("data.txt","w");
fprintf(fp,"%d\n",n);
srand((unsigned)time(NULL));
for(i = 0; i < n; i++) {
data = rand();
fprintf(fp,"%d ",data);
}
fclose(fp);
}
void readdata(int a[], int n){
FILE *fp;
int fn, i;
fp = fopen("data.txt","r");
fscanf(fp,"%d",&fn);
if(fn > n){
fn = n;
}
for(i = 1; i <= fn; i++){
fscanf(fp,"%d",a+i);
}
fclose(fp);
}
int main(int argc, char *argv[]) {
int count = 60, i, data[101];
FILE *fp;
//createdata(count);
for(i = 0; i < 10; i++){
createdata(count);
readdata(data, 100); InsertSort(data,count);
readdata(data, 100); ShellSort(data,count);
readdata(data, 100); BubbleSort(data,count);
readdata(data, 100); QuickSort(data,1,count);
readdata(data, 100); SelectSort(data,count);
readdata(data, 100); HeapSort(data,count);
readdata(data, 100); MergeSort(data,1,count);
readdata(data, 100); RadixSort(data,count);
}
fp = fopen("result.txt","w");
for(i = 0; i < 7; i++){
fprintf(fp,"%d ",times[i]);
}
fclose(fp);
/*int x[12] = {0,55,78,1,66,4,77,5,9,88,79,82},i;
0 1 82 4 55 5 66 77 78 88 9 79
0 1 4 5 9 55 66 77 78 79 82 88
RadixSort(x, 11);
for(i = 1; i < 12; i++) {
printf("%5d",x[i]);
}
printf("\n");
// x = log(20)/log(2);
// printf("%d",x);
*/
return 0;
}