快速排序和堆排序(递减)

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

image

image

#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;
}
posted @ 2021-06-10 13:13  钝小小丐  阅读(570)  评论(0)    收藏  举报