快速排序和堆排序(递减)
① 用随机数生成若干个(例如1000个)在某个区间(例如[0, 10000])之间的整数;
② 以此数组元素作为关键字,采用快速排序算法按非递减方式进行排序,给出操作的结果及相应的操作次数;
③ 以此数组元素作为关键字,采用堆排序算法按递减(非递增)方式进行排序,给出操作的结果及相应的操作次数;
主函数通过调用函数实现以上操作。


#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 100
void randnumber(int num[]) //生成0 - 10000 以内的 100 个 随机数
{
int i;
srand((unsigned)(time(NULL))); //初始化随机种子
for (i = 0; i < N; i++)
num[i] =( rand() % 10000);
}
void quicksort(int arr[], int left, int right, int* compare, int* move)
{
int temp;
int i = left, j = right; // left 和 right 分别为要比较的区域边界
if (left < right)
{
temp = arr[left];
while (i != j)
{
while (j > i && arr[j] > temp)
{
--j;
(*compare)++;
}//从右边扫描找到一个小于temp元素
if (i < j)
{
arr[i] = arr[j];
(*move)++;
++i;
}
while (i < j && arr[i] < temp)
{
++i;
(*compare)++;
}//从左边扫描,找到一个大于temp元素
if (i < j)
{
arr[j] = arr[i];
(*move)++;
--j;
}
}
arr[i] = temp;//temp放在最终位置
(*move)++;
quicksort(arr, left, i - 1, compare, move); //对temp左边元素进行扫描
quicksort(arr, i + 1, right, compare, move); //对temp右边元素进行扫描
}
}
void CreatHeap(int a[], int n, int h, int* operation)
{
int i, j, flag;
int temp;
i = h;
j = 2 * i + 1;
temp = a[i];
flag = 0;
//沿左右还在种值较大者重复向下筛选
while (j < n && flag != 1)
{
//
if (j < n - 1 && a[j] > a[j + 1])
{
j++; (*operation)++;
}
if (temp < a[j])
flag = 1;
else
{
a[i] = a[j];
i = j;
j = 2 * i + 1;
}
(*operation) = (*operation) + 1;
}
a[i] = temp;
}
void InitCreatHeap(int a[], int n,int *operation)
{
int i;
for (i = (n - 2) / 2; i >= 0; i--)
CreatHeap(a, n, i,&*operation);
}
void HeapSort(int a[], int n, int* operation)
{
int i;
int temp;
InitCreatHeap(a, n, &*operation);
for (i = n - 1; i > 0; i--)
{
temp = a[0];
a[0] = a[i];
a[i] = temp;
CreatHeap(a, i, 0, &*operation);
(*operation) = (*operation) + 3;
}
}
int main()
{
int i;
int num1[N], num2[N], num3[N];
int quickcompare = 0, quickmove = 0, HeapOperationTimes = 0;
randnumber(&num1);
printf("生成的随机数组:\n");
//打印生成的随机数
for (i = 0; i < N; i++)
{
printf("%4d ", num1[i]);
if ((i+1) % 15 == 0)printf("\n");
}
printf("\n\n\n\n");
for (i = 0; i < N; i++)//将num1数组赋值给num2
{
num2[i] = num1[i];
}
printf("\t\t 快速排序↓\n");
quicksort(&num2, 0,N-1, &quickcompare, &quickmove);//快速排序
for (i = 0; i < N; i++)//输出快速排序后的数组
{
printf("%4d ", num2[i]);
if ((i + 1) % 15 == 0)printf("\n");
}
printf("\n\n");
printf("此次快速排序操作次数为:%d",quickmove+quickcompare);
printf("\n\n\n\n");
for (i = 0; i < N; i++)
{
num3[i] = num1[i];
}
printf("堆排序:\n");
HeapSort(&num3, N, &HeapOperationTimes);
for (i = 0; i < N; i++)
{
printf("%4d ", num3[i]);
if ((i + 1) % 15 == 0)printf("\n");
}
printf("\n\n此次堆排序的操作次数为:%d", HeapOperationTimes);
printf("\n\n\n\n");
return 0;
}

浙公网安备 33010602011771号