二维数组的列排序

给出一个二维数组,请将这个二维数组按第i列(i从1开始)排序,如果第i列相同,则对相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,则继续比较第i+2列,以此类推,直到最后一列。如果第i列到最后一列都相同,则按原序排列。 

 

实现以下接口:

输入一个m*n 的整数数组,实现按规则排列,返回排列后的数组。

调用者会保证:

比如输入数组为: 

1,2,3

2,3,4

2,3,1

1,3,1

按第二列排序: 

输出: 

1,2,3

2,3,1

1,3,1

2,3,4


分析:从最后一列开始使用稳定的排序算法(必须是稳定,可采用冒泡排序)排序,一直排序到指定的列为止。

程序代码如下:

// 功能:排列一个m行n列 大小的数组
// 输入: int * pArray 指向数组第一个元素的指针,m为行数, n为列数 ,请按第i列排列
// 输出:按第i列排序完成后的数组放到入参指定的地址中	(i的取值范围 1 - n)  
// 返回:
void RangeArray(int * pArray,unsigned int  m, unsigned int  n,unsigned int  i)
{	
	if( pArray == NULL || m<0 || n<0 || i>n )
		return;
	int * tempArray=new  int[n];
	//从最后一列开始排序,排序到指定列
	for(unsigned int column=n-1;column>=i-1;column--){
		//对每一列进行排序,冒泡排序的变形
		for(unsigned int i=0;i<m-1;i++){

			for(unsigned int j=0;j<m-i-1;j++){

				//交换数组元素
				if(*(pArray+j*n+column) > *(pArray+(j+1)*n+column)){
					memcpy(tempArray,pArray+j*n,n*sizeof(int));
					memcpy(pArray+j*n,pArray+(j+1)*n,n*sizeof(int));
					memcpy(pArray+(j+1)*n,tempArray,n*sizeof(int));
				}	
			}
			
		}
		if(column==0)
			break;
	}

}


  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值