时间复杂度n*k/2,对一串数中排列出前5和后5,前十个冒泡排序,后面的堆排序。降低了时间复杂度。
传入二维字符串数组,一个还是name一个是要排列的数。
/**
* 建立而二维数组,排序前五个和后五个
* @param con 二维数组,名字和数据
* @return 前5个最小,后5个最大,大小为10的数组
*/
public String [][] getFive(String[][] con) {
float[] save = new float[10];
String[] name = new String[10];
int sum = 10;
if (con.length < 10) {
sum = con.length;
}
for (int i = 0; i < sum; i++) {
try {
save[i] = Float.valueOf(con[i][1]);
name[i] = con[i][0];
} catch (Exception e) {
}
}
float temp = 0;
String strTemp = "";
for (int i = 0; i < save.length; i++) {
for (int j = 0; j < save.length; j++) {
if (save[i] < save[j]) {
strTemp = name[i];
name[i] = name[j];
name[j] = strTemp;
temp = save[i];
save[i] = save[j];
save[j] = temp;
}
}
}
if (con.length > 10) {
//存储当前数
float test = 0;
for (int i = 10; i < con.length; i++) {
try {
test = Float.valueOf(con[i][1]);
if (test >= save[9]) {
for (int j = 5; j <=9; j++) {
if (j == 9) {
save[j] = test;
name[j]=con[i][0];
}else{
save[j] = save[j + 1];
name[j]=name[j+1];
}
}
continue;
}
if (test <= save[0]) {
for (int j = 4; j >= 0; j--) {
if (j == 0) {
save[j] = test;
name[j]=con[i][0];
}else{
save[j] = save[j - 1];
name[j]=name[j-1];
}
}
continue;
}
for (int p = 1; p < 5; p++) {
if (test >= save[p - 1] && test < save[p]) {
for (int j = 4; j >= p; j--) {
if (j == p) {
save[j] = test;
name[j]=con[i][0];
} else {
save[j] = save[j - 1];
name[j] = name[j-1];
}
}
break;
}
}
for (int p = 6; p < 10; p++) {
if (test > save[p-1] && test <= save[p]) {
for (int j = 5; j < p; j++) {
if (j == p-1) {
save[j] = test;
name[j] = con[i][0];
continue;
} else {
save[j] = save[j+1];
name[j] = name[j+1];
}
}
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
String [][] str=new String[2][10];
for(int i=0;i<10;i++){
str[0][i]=name[i];
str[1][i]=save[i]+"";
}
return str;
}