QuickSort 算法有问题
Something Wrong with QuickSort algorithm
快速排序Java实施-
我已经编写了一个程序来实现 QuickSort 算法,但它没有正确显示排序序列,它还显示数组越界索引异常。有人能告诉我代码或逻辑有什么问题吗?
import java.util.*;
public class QuickSort{
int num,arrayQS[],i;
public void quicksort(int ar[],int start,int end){
if(start<end){
int pindex=partition(ar,start,end);
System.out.println(pindex);
quicksort(ar,start,pindex-1);
quicksort(ar,pindex+1,end);
}
}
public int partition(int pAR[],int start, int end){ //partition function
int key;
int swapper;
int pivot=pAR[end];
int pIndex=start;
for(i=0;i<end;i++){
if(pAR[i]<=pivot){
//swapiing
key=pAR[pIndex];
pAR[pIndex]=pAR[i];
pAR[i]=key;
pIndex++;
}
}
//swap
swapper=pAR[pIndex];
pAR[pIndex]=pAR[end];
pAR[end]=swapper;
return pIndex;
}
public void arrayInputFn(){
Scanner in=new Scanner(System.in);
System.out.println("enter the number you want to insert in an array");
num=in.nextInt();
arrayQS=new int[num];
System.out.println("enter the elements in an array: ");
for(i=0;i<num;i++){
arrayQS[i]=in.nextInt();
}
quicksort(arrayQS,0,arrayQS.length-1);
for(i=0;i<arrayQS.length;i++){
System.out.print(arrayQS[i]);
}
}
public static void main(String[] args){
QuickSort qs=new QuickSort();
qs.arrayInputFn();
}
}
for(i=0;i<end;i++){
起始索引应该是 start
,而不是 0
。您正在将整个数组传递给该方法,但您一次只对其中的一部分进行排序(第一次调用除外),如 start
和 end
.
所指定
您还应该提取 swap 方法以使代码更整洁。
public int partition(int pAR[], int start, int end) {
int pivot = pAR[end];
int pIndex = start;
for (i = start; i < end; i++) {
if (pAR[i] <= pivot) {
swap(pAR, i, pIndex);
pIndex++;
}
}
swap(pAR, pIndex, end);
return pIndex;
}
public void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
快速排序Java实施- 我已经编写了一个程序来实现 QuickSort 算法,但它没有正确显示排序序列,它还显示数组越界索引异常。有人能告诉我代码或逻辑有什么问题吗?
import java.util.*;
public class QuickSort{
int num,arrayQS[],i;
public void quicksort(int ar[],int start,int end){
if(start<end){
int pindex=partition(ar,start,end);
System.out.println(pindex);
quicksort(ar,start,pindex-1);
quicksort(ar,pindex+1,end);
}
}
public int partition(int pAR[],int start, int end){ //partition function
int key;
int swapper;
int pivot=pAR[end];
int pIndex=start;
for(i=0;i<end;i++){
if(pAR[i]<=pivot){
//swapiing
key=pAR[pIndex];
pAR[pIndex]=pAR[i];
pAR[i]=key;
pIndex++;
}
}
//swap
swapper=pAR[pIndex];
pAR[pIndex]=pAR[end];
pAR[end]=swapper;
return pIndex;
}
public void arrayInputFn(){
Scanner in=new Scanner(System.in);
System.out.println("enter the number you want to insert in an array");
num=in.nextInt();
arrayQS=new int[num];
System.out.println("enter the elements in an array: ");
for(i=0;i<num;i++){
arrayQS[i]=in.nextInt();
}
quicksort(arrayQS,0,arrayQS.length-1);
for(i=0;i<arrayQS.length;i++){
System.out.print(arrayQS[i]);
}
}
public static void main(String[] args){
QuickSort qs=new QuickSort();
qs.arrayInputFn();
}
}
for(i=0;i<end;i++){
起始索引应该是 start
,而不是 0
。您正在将整个数组传递给该方法,但您一次只对其中的一部分进行排序(第一次调用除外),如 start
和 end
.
您还应该提取 swap 方法以使代码更整洁。
public int partition(int pAR[], int start, int end) {
int pivot = pAR[end];
int pIndex = start;
for (i = start; i < end; i++) {
if (pAR[i] <= pivot) {
swap(pAR, i, pIndex);
pIndex++;
}
}
swap(pAR, pIndex, end);
return pIndex;
}
public void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}