給出一個二維數組,請將這個二維數組按第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*(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; } }