Мне удалось исправить несколько ошибок. Незначительный является этой строкой:
return Rand_partition(a,r-1,q,i-k);
^
Вместо этого вы хотите это:
return Rand_partition(a,r+1,q,i-k);
^
Это потому, что вы разбили a[p..q]
на три части следующим образом:
a[p..r-1], a[r], a[r+1..q]
Ваш исходный код прекрасно обрабатывает регистр a[r]
и a[p..r-1]
, но портит a[r+1..q]
, используя вместо него r-1
.
Мне также удалось исправить и упростить partition
:
public static int partition(int a[],int p,int q){
int m=a[p]; // not m[0], you want to partition m[p..q]!!!
while ( p<q){
while (p<q && a[p] <m){ // don't do p++ here!
p++;
}
while (q>p && a[q]>m){ // don't do q-- here!
q--;
}
int t=a[p];
a[p]=a[q];
a[q]=t;
}
return p; // no need to search!!!
}
Ваш исходный код содержал посторонние p++
и q--
. Кроме того, поиск, где находится стержень, не нужен. Это где p
и q
встречаются.
Об соглашениях по присвоению имен
Пожалуйста, соблюдайте Соглашения об именах Java :
Имена классов должны быть существительными, в смешанном регистре с заглавной первой буквой каждого внутреннего слова. Методы должны быть глаголами, в смешанном регистре с первой буквой в нижнем регистре, причем первая буква каждого внутреннего слова пишется с большой буквы.
Смежные вопросы
В объявлениях массива
Кроме того, не создавайте привычку объявлять массивы следующим образом:
int x[];
Вместо скобок следует использовать тип , а не идентификатор :
int[] x;
Похожие вопросы