砾石排序(作业)

设有顺序放置的 n 个桶,每个桶中装有一粒砾石,每粒砾石颜色是红、白、蓝之一。求重新调整这些砾石的位置,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石在后,重新安排时对每粒砾石的颜色只能看一次,并用只允许交换操作为调整砾石的位置。

#include <stdio.h>
#include <stdlib.h>

void Print(int* arr, int length)
{
	for (int i = 1; i <= length; i++)
		printf("%d ", arr[i]);
}

void QuickSort(int* arr, int low, int high)
{ 
	int i = 1,j=1,k=high,temp;
	while (k != j)
	{
		while (arr[k] == 3) k--;    //k指的是蓝色,故直接后移
		if(arr[k]==1)        //k指的是红色
			if (i >= j)     //i左侧全部是红色,直接将k所指红色与i交换即可
			{
				temp = arr[k];
				arr[k] = arr[i];
				arr[i] = temp;
				i++;
			}
			else            //i<j时表示i所指为白色,此时应当将未处理的j所指与i交换,再将k所指红色与未处理交换
			{
				temp = arr[j];
				arr[j] = arr[i];
				arr[i] = temp;
				j++;
				temp = arr[k];
				arr[k] = arr[i];
				arr[i] = temp;
				i++;
			}
		if(arr[k]==2)     //k指的是白色
			if (i <= j)   //j左侧为白色,直接将k所指交换即可
			{
				temp = arr[k];
				arr[k] = arr[j];
				arr[j] = temp;
				j++;
			}
			else         //j指的是红色,i的左侧是红色,故应当将k与i交换
			{
				temp = arr[k];
				arr[k] = arr[i];
				arr[i] = temp;
				j = i + 1;
			}
	}
	if (arr[k] == 2) j++; //此时k=j且j所指为白色
	else if (arr[k] == 1)  //j=k且j所指为红色,故应当和j所指调换位置
	{
		temp = arr[j];
		arr[j] = arr[i];
		arr[i] = temp;
		i++;
		j++;
	}
}

void main()
{
	int* arr;
	int  length;
	printf("请输入n的值");
	scanf_s("%d", &length);
	arr = (int*)malloc(sizeof(int) * (length + 1));
	printf("请依次输入石头颜色类型(1表示红色,2表示白色,3表示蓝色)");
	for (int i = 1; i <= length; i++)
		scanf_s("%d", &arr[i]);
	QuickSort(arr, 1, length);
	Print(arr, length);
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值