一个数组变换的算法问题-关于前端的分页功能排序(点击/热门)功能
来源:互联网 发布:如何开发聊天软件 编辑:程序博客网 时间:2024/06/05 05:43
由于最近使用算法,所以算法用java来写的。(其实嘛,C写也是一样的)、
我们所需要的算法原则 如下所示
我们现在有一个数组 例如
1 2 3 4
5 6 7 8
9 10 11 12
现在的目的是将其转换为
1 2 7 8
3 4 9 10
5 6 11 12
现在也就是这样的原则
将数组中的数字以6个位一组抽取出来 然后放到另外的一个二维数组之中。
测试用例
Case 1
输入 1 2 3 4 5 6 7 8 9 10 11 12 m=3 n=4 p=2
输出 1 2 7 8 3 4 9 10 5 6 11 12
Case 2
输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 m=4 n = 4 p=2
输出 1 2 9 10 3 4 11 12 5 6 13 14 7 8 15 16
其中m n 分别为原来数组的行和列 p 表示将原先的列分成的几份
PS 其实这样还是有点奇怪的 毕竟万一要切行怎么办 所以算法有一定的局限性
对于原来的数字来说 他们在数组中的位置为 (原来的行为RowNum 列为ColumnNum )
行 number/ColumnNum 列为(number-1)%ColumnNum 包含数组中的第0行和第0列
转换后的数组坐标为
在说数组坐标之前 我们将数组分成很多的页 每页的列为n/P 每页的数字个数为m*n/p
对于一个数字 我们首先确定他 在变换后矩阵中的位置
在矩阵2中 我们可以三维坐标定位 一个数组:
tab_column tab_row tab_num_index
首先数字位于变化后的第几张tab页 也就是 (number-1)/(m*n/p)
这里为什么需要-1 是因为 比如一页6个元素 1/6=0 6/6=1 但是6仍然位于第0页上 而不是第1页
然后是元素的index 也就是这个元素属于这一页的第几个元素 tab_index=number-tab_num_index*(m*n/p)
这里为了简要处理 可以将m*n/p 用tabNum 来表示
这样只之后 就可以确定数字在新的页内的横纵坐标 tab_row_index=(tab_index-1)/tab_cloumn tab_column_index=(tab_index-1)%tab_column
这样一个三维坐标 就可以确定一个数字了tab-index 位于第几页上面 tab_row_index 页内行坐标 tab_column_index 页内纵坐标
然后我们将关于页的三维坐标 转换为我们经常用的二维坐标
如果是横向的排序 real_row=tab_row_index real_column=tab_index*tab_column+tab_column_index
如果是纵向的排序real_row=tab_row_index+tab_index*tab_row real_column=tab_column_index
最后我们需要输出的是一个一维数组的形式 用一个以为数组对于原来的数组进行扫描就好了。
PS 到最后我都不明白为什么前端将一个分页功能的排序做的如此之复杂 但是 我也只能这样照做了。223
下面的代码
package test;public class test {public static void sortTab(int m,int n,int p){//int p=2;//原始列个数//int m=4;//int n=4;//int p=2;int tabRowNum=((m*n)/(n/p))/p;//变化后行个数 m行 n列int tabColumnNum=p;//变化后列个数 Pint formerNum=m*n;//nint tabNum=tabRowNum*tabColumnNum;int row_index=0;int column_index=0;int tab_num_index=0;int tab_current_index=0;int row_tab_index=0;int column_tab_index=0;int arry_end[]=new int[formerNum];int arry_sort[][]=new int[(formerNum/tabNum)*tabRowNum][(formerNum/tabNum)*tabColumnNum];for(int i=1;i<=(formerNum);i++){//i表示原来在数组中是第几个数字//row_index=i/columnNum;//column_index=(i-1)%columnNum;//row column表示在 原二维数组中的位置 包含0行 0列tab_num_index=(i-1)/tabNum;tab_current_index=(i-1)%tabNum+1;row_tab_index=(tab_current_index-1)/tabColumnNum;column_tab_index=(tab_current_index-1)%tabColumnNum;int temp_column=tab_num_index*tabColumnNum+column_tab_index;int temp_row=row_tab_index;arry_sort[temp_row][temp_column]=i;//arry_sort[temp_row][temp_column]=tab_num_index*tabNum+tab_current_index;}int index_end=0;for(int tab_i=0;tab_i<tabRowNum;tab_i++){for(int tab_j=0;tab_j<((formerNum/tabNum)*tabColumnNum);tab_j++){ arry_end[index_end++]=arry_sort[tab_i][tab_j];}}System.out.println("Sort Result:");for(int j=0;j<formerNum;j++){System.out.print(" "+arry_end[j]+" ");}}public static void main(String args[]){/*//int p=2;//原始列个数int m=4;int n=4;int p=2;int tabRowNum=((m*n)/(n/p))/p;//变化后行个数 m行 n列int tabColumnNum=p;//变化后列个数 Pint formerNum=m*n;//nint tabNum=tabRowNum*tabColumnNum;int row_index=0;int column_index=0;int tab_num_index=0;int tab_current_index=0;int row_tab_index=0;int column_tab_index=0;int arry_end[]=new int[formerNum];int arry_sort[][]=new int[(formerNum/tabNum)*tabRowNum][(formerNum/tabNum)*tabColumnNum];for(int i=1;i<=(formerNum);i++){//i表示原来在数组中是第几个数字//row_index=i/columnNum;//column_index=(i-1)%columnNum;//row column表示在 原二维数组中的位置 包含0行 0列tab_num_index=(i-1)/tabNum;tab_current_index=(i-1)%tabNum+1;row_tab_index=(tab_current_index-1)/tabColumnNum;column_tab_index=(tab_current_index-1)%tabColumnNum;int temp_column=tab_num_index*tabColumnNum+column_tab_index;int temp_row=row_tab_index;arry_sort[temp_row][temp_column]=i;//arry_sort[temp_row][temp_column]=tab_num_index*tabNum+tab_current_index;}int index_end=0;for(int tab_i=0;tab_i<tabRowNum;tab_i++){for(int tab_j=0;tab_j<((formerNum/tabNum)*tabColumnNum);tab_j++){ arry_end[index_end++]=arry_sort[tab_i][tab_j];}}System.out.println("Sort Result:");for(int j=0;j<formerNum;j++){System.out.print(" "+arry_end[j]+" ");}*/sortTab(4,4,2); }}
大神写的
<script> var p=3;//显示区域的列数 var m=6;//整个列数 var n=3;//整个行数 var result=[];//结果数组 var a=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18];//原数据,这里的length为m乘以n //a.length/p/n for(var i=0;i<m/p*n;i++){ for(var k=0;k<m/p;k++){ if(i%(m/p)==k){ if(k==0){ getPnum(i/(m/p)); }else{ getPnum(Math.floor(i/(m/p))+i%(m/p)*n); } break; } } } function getPnum(i){ for(var j=0;j<p;j++){ result.push(a[p*i+j]); } } console.log(result); </script>
- 一个数组变换的算法问题-关于前端的分页功能排序(点击/热门)功能
- 一个带自定义分页,排序功能的DATAGRID控件
- 前端分页功能的实现以及原理
- 关于Q3ListView的排序功能
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- 一个功能齐全的DataGrid分页例子
- Python nltk载入自己的中文语料库的两种方法 for Windows7
- CodeForces 552C:Vanya and Scales【技巧】
- hal层
- 基于指定输入文本的百度地图poi城市检索的使用(思路最重要)
- 51Nod-1069-Nim游戏
- 一个数组变换的算法问题-关于前端的分页功能排序(点击/热门)功能
- hdu2955 Robberies --01背包
- 简单C++ log 类
- 设计模式是什么?
- 认识——数据库存储过程和游标
- mysql开启慢查询日志和新增日志--linux
- JSP
- stack overflow的 问题
- hdu1811 Rank of Tetris(并查集+拓扑排序)