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();
}
处理结果如图所示: