2013年预赛第六题三部排序

题目:三部排序(7分)

一般的排序有许多经典算法,如快速排序、希尔排序等。但实际应用时,经常会或多或少有一些特殊要求。我们没必要套用那些经典算法,可以根据实际情况建立更好的解法。

比如,对一个整型数组中的数字进行分类排序:使得负数都靠左端,正数都靠右端,0在中部。注意问题的特点是:负数区域和正数区域内并不要求有序。可以利用这个特点通过1次线性扫描就结束战斗!

以下的程序实现了该目标。其中x指向待排序的整型数组,len是数组的长度。

#include <stdio.h>
void sort3p(int *x,int len)
{ int p=0;
  int left=0;
  int right=len-1;
  int t;
  while(p<=right)
    { if(x[p]<0)
        { t=x[left];  x[left]=x[p];  x[p]=t;  left++;  p++; }
	  else if(x[p]>0) { t=x[right];  x[right]=x[p];  x[p]=t;  right--; }
		   else { _______________________//填空位置
		       }
	}
}

如果给定数组:25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0

则排序后为:-3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25

 

解题思路:else中的条件为下x[p]==0, 因为0在中间,既不能和left交换,也不能和right交换,所以不做处理,像搁在正负数之间的隔板,当左边有当左边有正数进来,隔板也会向右移动,所以要保证循环继续进行,填空内容为 p++

#include<stdio.h>
void sort3p(int *x, int len){
	int p = 0;
	int left = 0;
	int right = len - 1;
	int t;
	while(p <= right){
		if(x[p] < 0){
			t = x[left]; x[left] = x[p]; x[p] = t;
			left++; p++; 
		}else if(x[p] > 0){
			t = x[right]; x[right] = x[p]; x[p] = t;
			right--;
		}else{
			p++;
		}
//		for(int i=0; i<len; ++i){
//			printf("%d ",x[i]);
//		}
//		printf("\n");
	}
}
int main()
{
	int arr[14] = {25, 18, -2, 0, 16, -5, 33, 21,
	0, 19, -16, 25, -3, 0};
	sort3p(arr, 14);
	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值