这个好象是快速排序吧,选取一个值,然后大的放一边 ,小的放另一边。。
不明白PivotIndex是在做什么, 他想得到怎样的值?
一开始我以为是first 和 last的中间值,肯定不对的,那根本没必要这么复杂。public class Sorts { // 交换位置
private void Swrap(int[] v, int index1, int index2) {
int temp = v[index1];
v[index1] = v[index2];
v[index2] = temp;
} // 将向量V中索引{first,last)划分成两个 左子表和右子表
// <param name="first">开始位置</param>
// <param name="last">结束位置</param>
//这一段是在干嘛? 选取轴值吗?
//为什么要这样选取?
//他最后是要返回一个怎样的值?
private int PivotIndex(int[] v, int first, int last) {
if (last == first) {
return last;
}
if (last - first == 1) {
return first;
}
int mid = (first + last) / 2;
int midVal = v[mid];
// 交换v[first]和v[mid]
Swrap(v, first, mid);
int scanA = first + 1;// 第2个
int scanB = last - 1;// 倒数第1 个 while (true) {
while (scanA < scanB && v[scanA] < midVal) {
scanA++;
}
while (scanB > first && midVal <= v[scanB]) {
scanB--;
}
if (scanA >= scanB)
break; Swrap(v, scanA, scanB);
scanA++;
scanB--; }
Swrap(v, first, scanB);
return scanB; } void sort(int[] v, int first, int last, int k) {
// 表示分表中值的索引
int index = 0;
index = PivotIndex(v, first, last);
if (index == k) {
output(v);
return;
} if (index > k) {
// 只在左子表中查找
sort(v, first, index, k);
} else if (index <= k) {
// 只在右子表中查找
sort(v, index, last, k);
}
} void sort(int[] v, int first, int last) {
int k = 1;// 选取轴值
sort(v, first, last, k);
} void output(int[] v) {
for (int i : v) {
System.out.print(i + " ");
}
} public static void main(String[] args) {
Sorts find = new Sorts();
int[] v = new int[] {6,5,4,3,2,1 };
find.sort(v, 0, v.length);
for (int i : v) {
System.out.print(i + " ");
}
}
}
不明白PivotIndex是在做什么, 他想得到怎样的值?
一开始我以为是first 和 last的中间值,肯定不对的,那根本没必要这么复杂。public class Sorts { // 交换位置
private void Swrap(int[] v, int index1, int index2) {
int temp = v[index1];
v[index1] = v[index2];
v[index2] = temp;
} // 将向量V中索引{first,last)划分成两个 左子表和右子表
// <param name="first">开始位置</param>
// <param name="last">结束位置</param>
//这一段是在干嘛? 选取轴值吗?
//为什么要这样选取?
//他最后是要返回一个怎样的值?
private int PivotIndex(int[] v, int first, int last) {
if (last == first) {
return last;
}
if (last - first == 1) {
return first;
}
int mid = (first + last) / 2;
int midVal = v[mid];
// 交换v[first]和v[mid]
Swrap(v, first, mid);
int scanA = first + 1;// 第2个
int scanB = last - 1;// 倒数第1 个 while (true) {
while (scanA < scanB && v[scanA] < midVal) {
scanA++;
}
while (scanB > first && midVal <= v[scanB]) {
scanB--;
}
if (scanA >= scanB)
break; Swrap(v, scanA, scanB);
scanA++;
scanB--; }
Swrap(v, first, scanB);
return scanB; } void sort(int[] v, int first, int last, int k) {
// 表示分表中值的索引
int index = 0;
index = PivotIndex(v, first, last);
if (index == k) {
output(v);
return;
} if (index > k) {
// 只在左子表中查找
sort(v, first, index, k);
} else if (index <= k) {
// 只在右子表中查找
sort(v, index, last, k);
}
} void sort(int[] v, int first, int last) {
int k = 1;// 选取轴值
sort(v, first, last, k);
} void output(int[] v) {
for (int i : v) {
System.out.print(i + " ");
}
} public static void main(String[] args) {
Sorts find = new Sorts();
int[] v = new int[] {6,5,4,3,2,1 };
find.sort(v, 0, v.length);
for (int i : v) {
System.out.print(i + " ");
}
}
}
解决方案 »
- 发现一个问题,求解
- URL相对转绝对的问题
- JAVA 如何去掉 JScrollPane 表头
- 急!弄了好几天了!
- 如何为某个组件设置单独的风格,比如界面整体用windows风格,而其中某个button使用metal外观
- 我在北京想找个培训机构学习java,参加过培训的朋友给小弟些建议呀
- 求救::无标题栏的窗体拖动
- Thinking in java2 里的一个包的问题。
- 使用了java help的界面应用打包成jar以后,不能用了
- java 线程sleep 疑问
- 请教一个小问题 paintComponent 函数调用不了(?)的问题.
- 大家在用java连接数据库时,把url、用户名、密码放在哪里
看看这个