二维数组的列排序

给出一个二维数组,请将这个二维数组按第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;
	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 03:31:51

二维数组的列排序的相关文章

c语言:将一个二维数组行和列的元素互换,存到另一个二维数组中。

将一个二维数组行和列的元素互换,存到另一个二维数组中. 解:程序: #include<stdio.h> int main() { int i, j, a[2][3] = { {1,2,3},{4,5,6} },b[3][2]; printf("array a:\n"); for (i = 0; i <=1; i++)//处理a数组中的一行中各元素 { for (j = 0; j <= 2; j++)//处理a数组中的某一列元素 { printf("%5

14周(二维数组姓名成绩排序)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:14周(二维数组姓名成绩排序) *作者:王忠 *完成日期:2014.12.01 *版本号:v1.0 * *问题描述:初始化同学的成绩,姓氏,按大小排序 *输入描述:无 *程序输出:按照姓名或者成绩大小排序并输出 #include <iostream> #include <string> using namespace std; const int num=8; i

14周(二维数组成绩姓名排序)

/* *copyright(c) 2014,烟台大学计算机学院 *All rights reserved. *文件名称:14周(二维数组成绩姓名排序) *作者:王忠 *完成日期:2014.12.01 *版本号:v1.0 * *问题描述:初始化同学的成绩,姓氏,按大小排序 *输入描述:无 *程序输出:按照姓名或者成绩大小排序并输出 #include <iostream> #include <string> using namespace std; const int num=8; i

二维数组按某列排序

1 using FrameWork.IoC.Achieve.IoCAbstractBasics; 2 using FrameWork.IoC.Achieve.IoCBasics; 3 using FrameWork.IoC.Case.Test; 4 using FrameWork.IoC.Case.Test.TestOne; 5 using FrameWork.IoC.Case.Test.TestTwo; 6 using System; 7 using System.Collections; 8

C# 实现二维数组的排序算法(代码)

class Order { /// <summary> /// 对二维数组排序 /// </summary> /// <param name="values">排序的二维数组</param> /// <param name="orderColumnsIndexs">排序根据的列的索引号数组</param> /// <param name="type">排序的类型,

二维数组针对某字段排序 - array_multisort()

/** * 针对二维数组下的某字段排序 * @param array $myarr 被排序数组 * @param string $sort_key 排序根据字段 * @param flag $sort_order 排序规则:SORT_ASC.SORT_DESC * @param flag $sort_type 排序类型:SORT_REGULAR.SORT_NUMERIC.SORT_STRING * @return array 排序后的数组 */ public function myarr_sor

PHP二维数组根据某个元素(key)排序

/** * 二维数组根据key排序 * @param $arr * @param $arr_key * @param string $order 排序规则 * @return mixed */ function myArrayMultisort($arr,$arr_key,$order='asc'){ foreach($arr as $val){ $key_arrays[]=$val[$arr_key]; } if ($order == 'asc'){ array_multisort($key_

剑指offer 面试题(二维数组中的查找) (2)

面试题: 二维数组中的查找 /* 题目:   在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成 一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该数. */ ps:(其实前段时间我就做过这道题,今天看到了,觉得还是有点生,那就再来一次吧) 题目分析:  在分析这个问题的时候,我们首先要看,在一个二维数组中查找一个数字是否存在,那么很多人就觉得 简单了,遍历二维数组与所需要查找的数字进行比较不就完了!  不可否认的是你说的是可行的,可是

二维数组的最大联通子数组和

设计题目:求一个二维数组的连通的数组中和最大的最大值. 设计思路: 建立二维数组并遍历二维数组,将所有正整数分块,验证是否联通,如果不联通,判断路径. package demo;import java.util.*;public class Lmax { static Scanner scanner = new Scanner(System.in); public static void main(String args[]){ int m,n; int b; Scanner scanner =