用三数中值分割法实现的快排问题,出现数组越界,求解
package com.mfl;
public class TestKuaiPai {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = { 13, 81, 92, 43, 65, 31, 57, 26, 75, 0 };
KuaiPai.quicksort(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
}
class KuaiPai {
public static void swap(int[] a, int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
/**
* 此方法将三元素中的最小者被分在a[left] 三元素中的最大者被分在a[right] 枢纽元放在a[right-1]
*
* @param a
* @param left
* @param right
* @return
*/
public static int median(int[] a, int left, int right) {
int center = (left + right) / 2;
if (a[center] < a[left]) {
swap(a, left, center);
}
if (a[right] < a[left]) {
swap(a, left, right);
}
if (a[right] < a[center]) {
swap(a, right, center);
}
swap(a, center, right - 1);
return a[right - 1];
}
public static void quicksort(int[] a, int left, int right) {
if (a.length == 0)
return;
if (a.length == 1)
return;
int pivot = median(a, left, right);
int i = left + 1;
int j = right - 2;
if (j > left && i < right) {
for (;;) {
while (a[i] < pivot) {
i++;
}
while (a[j] > pivot) {
j--;
}
if (i < j) {
swap(a, i, j);
} else
break;
}
swap(a, i, right - 1);
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
} else {
median(a, left, right);
}
}
}
请问应该怎样限制条件防止数组越界呢?谢谢
[最优解释]
如果数据只剩下2个呢?你还找什么Center??
如果数据就剩下1个呢?你还left ,right?
所以,如果right-left的差距小于3,你要单独处理。
[其他解释]
好吧,我承认,我看不下去了,冒昧的问一句,楼主想要什么样的排序方法。
快速排序?代码如下:
package src;
class quicksort
{
public int data[];
private int partition(int sortArray[],int low,int hight)
{
int key = sortArray[low];
while(low<hight)
{
while(low<hight && sortArray[hight]>=key)
hight--;
sortArray[low] = sortArray[hight];
while(low<hight && sortArray[low]<=key)
low++;
sortArray[hight] = sortArray[low];
}
sortArray[low] = key;
return low;
}
public void sort(int low,int hight)
{
if(low<hight)
{
int result = partition(data,low,hight);
sort(low,result-1);
sort(result+1,hight);
}
}
public void display()
{
for(int i=0;i<data.length;i++)
{
System.out.print(data[i]);
System.out.print(" ");
}
}
}
快速排序,首先先一个key(一般就用数组的第一个),然后后面的元素依次和key比较,大的放在一边,晓得放在另一边。之后再对左右两边的依次做上面的操作。
[其他解释]
1楼通常情况下是将第一个元素用作枢纽元,但是如果输入是预排序的或是反序的,那么这样的枢纽元就是一个劣质分割,因为所有的元素不是都被划入s1就是都被划入s2,我采用的是三数中值分割法。
[其他解释]
首先,你这个程序放到数据结构版面更合适。
第二,这种算法分析的希望多加些注释,要不一般没有那么大的耐心去分析。
第三,三数中值分割法,这个排序方法没听过,应该不是常用的把。好像对于大数据量的话,快速排序和堆栈排序时最快的。当然,每种排序都是最适合的和最不适合的序列。
最后,数组越界问题只能靠你自己思考了,申明或者使用的时候尽量注意,如果报错了调错应该也不是特别麻烦的事。
[其他解释]
请您搞明白我没有说三数中值分割法是排序算法,所以请您弄懂问题的意思再做回答,谢谢