实测几种排序算法的耗时比较

1、 用随机数产生500,5000,50000个随机整数,数据范围分别为【0-1000】、【0-10000】、【0-100000】分别存入数组a,b,c
2、 实现希尔排序,直接稳定选择排序,快排、二路归并、堆排序。

#include "stdio.h"
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
void ShellSort(int a[], int n, int dk)
{
	int i, j, k, span, temp;
	for (i = 0; i < dk; i++)
	{
		span = a[i];
		for (j = i; j < n - dk; j += dk)//直接插入法排序
		{
			k = j;
			temp = a[k + dk];
			while (k>-1 && temp < a[k])
			{
				a[k + dk] = a[k];
				k -= dk;
			}
			a[k + dk] = temp;
		}
	}
	if (dk / 2)
		ShellSort(a, n, dk / 2);
}
void SelectSort(int a[], int n)
{
	int i, j, temp, small;
	for (i = 0; i < n; i++)
	{
		small = i;
		for (j = i + 1; j < n; j++)
		if (a[j] < a[small])
			small = j;
		temp = a[small];

		while (small>i)
			a[small--] = a[small - 1];
		a[i] = temp;
	}
}

void QuickSort(int a[], int low, int high)
{
	int i = low, j = high, key = a[low];
	while (i < j)
	{
		while (i < j && a[j] >= key)    j--;
		if (i<j)    a[i++] = a[j];

		while (i < j && a[i] <= key)    i++;
		if (i<j)    a[j--] = a[i];
	}
	a[i] = key;
	if (i - 1>low)	QuickSort(a, low, i - 1);
	if (i + 1<high)	QuickSort(a, i + 1, high);
}
void MergeSort(int a[], int n)
{
	int i, j, k, span = 1;
	int u1, l1, u2, l2, m;
	int *swap;

	swap = (int*)malloc(sizeof(int)*n);
	for (i = 0; i < n; i++)
		swap[i] = a[i];
	while (span < n)
	{
		l1 = 0;
		m = 0;
		while (l1 + span <= n - 1)
		{
			l2 = l1 + span;
			u1 = l2 - 1;
			u2 = (l2 + span - 1 <= n - 1) ? l2 + span - 1 : n - 1;
			for (k = l1, j = l2; k <= u1&&j <= u2; m++)
			{
				if (a[k] <= a[j])
				{
					swap[m] = a[k];
					k++;
				}
				else
				{
					swap[m] = a[j];
					j++;
				}
			}
			while (k <= u1)
			{
				swap[m] = a[k];
				m++;
				k++;
			}
			while (j <= u2)
			{
				swap[m] = a[j];
				m++;
				j++;
			}
			l1 = u2 + 1;
		}
		//将原始数组中只够一组的数据元素顺序存放到数组swap中
		for (k = 0; k < l1; k++)
			a[k] = swap[k];
		span *= 2;
	}
}

void CreatHeap(int a[], int n, int h)
{
	int temp, flat = 1, i, father = h, son = 2 * father + 1;

	while (son<n && flat == 1)
	{
		if (son + 1 <n && a[son + 1] > a[son])	son++;
		flat = 0;

		if (a[son] > a[father])
		{
			flat = 1;
			temp = a[son];
			a[son] = a[father];
			a[father] = temp;
		}
		father = son;
		son = father * 2 + 1;
	}
}
void HeapSort(int a[], int n)
{
	int i, temp;
	//初始化数列
	for (i = (n - 2) / 2; i >= 0; i--)
	{
		CreatHeap(a, n, i);
	}
	for (i = n - 1; i > 0; i--)
	{
		temp = a[0];
		a[0] = a[i];
		a[i] = temp;
		CreatHeap(a, i, 0);
	}
}

void main()
{
	int i, j;
	clock_t start, finish;     //clock_t是clock()函数返回的变量类型
	double duration;
	int a[500], b[5000], c[50000];
	int d[10] = { 32, 34, 44, 23, 2, 22, 14, 31, 4, 21 };
	srand(time(NULL));
	for (i = 0; i < 50000; i++)
	{
		if (i < 500)
			a[i] = rand() % 1000;
		if (i < 5000)
			b[i] = rand() % 10000;
		if (i < 50000)
			c[i] = rand() % 100000;
	}

	for (i = 0; i < 500; i++)
		a[i] = rand() % 1000;
	start = clock();
	ShellSort(a, 500, 500 / 2);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("500 ShellSort %lf\n", duration);

	for (i = 0; i < 500; i++)
		a[i] = rand() % 1000;
	start = clock();
	SelectSort(a, 500);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("500 SelectSort %lf\n", duration);

	for (i = 0; i < 500; i++)
		a[i] = rand() % 1000;
	start = clock();
	QuickSort(a, 0, 500 - 1);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("500 QuickSort %lf\n", duration);

	for (i = 0; i < 500; i++)
		a[i] = rand() % 1000;
	start = clock();
	SelectSort(a, 500);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("500 SelectSort %lf\n", duration);

	for (i = 0; i < 500; i++)
		a[i] = rand() % 1000;
	start = clock();
	HeapSort(a, 500);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("500 HeapSort %lf\n", duration);

	for (i = 0; i < 5000; i++)
		b[i] = rand() % 10000;
	start = clock();
	ShellSort(b, 5000, 5000 / 2);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("5000 ShellSort %lf\n", duration);

	for (i = 0; i < 5000; i++)
		b[i] = rand() % 10000;
	start = clock();
	SelectSort(b, 5000);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("5000 SelectSort %lf\n", duration);

	for (i = 0; i < 5000; i++)
		b[i] = rand() % 10000;
	start = clock();
	QuickSort(b, 0, 5000 - 1);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("5000 QuickSort %lf\n", duration);

	for (i = 0; i < 5000; i++)
		b[i] = rand() % 10000;
	start = clock();
	SelectSort(b, 5000);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("5000 SelectSort %lf\n", duration);

	for (i = 0; i < 5000; i++)
		b[i] = rand() % 10000;
	start = clock();
	HeapSort(b, 5000);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("5000 HeapSort %lf\n", duration);

	for (i = 0; i < 50000; i++)
		c[i] = rand() % 100000;
	start = clock();
	ShellSort(c, 50000, 50000 / 2);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("50000 ShellSort %lf\n", duration);

	for (i = 0; i < 50000; i++)
		c[i] = rand() % 100000;
	start = clock();
	SelectSort(c, 50000);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("50000 SelectSort %lf\n", duration);


	for (i = 0; i < 50000; i++)
		c[i] = rand() % 100000;
	start = clock();
	QuickSort(c, 0, 50000 - 1);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("50000 QuickSort %lf\n", duration);

	for (i = 0; i < 50000; i++)
		c[i] = rand() % 100000;
	start = clock();
	SelectSort(c, 50000);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("50000 SelectSort %lf\n", duration);

	for (i = 0; i < 50000; i++)
		c[i] = rand() % 100000;
	start = clock();
	HeapSort(c, 50000);
	finish = clock();
	duration = (double)(finish - start) / CLOCKS_PER_SEC;
	printf("50000 HeapSort %lf\n", duration);
	getchar();



	getchar();
}

处理结果如图所示:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值