我是编程和java的新手所以请不要嘲笑这个:)。 now..i在网上查看了QuickSort算法的正确实现,我知道这一点。但我试图以我能想到的非常无辜的基本方式实现它。实际创建两个单独的数组(左,右)并继续对它们进行排序等等......
这是代码:
package excercise;
public class MyQuickSort {
public static int list[] = {6,5,3,1,8,7,2,4};
public static int[] addNumberToArray(int array[],int num){
int newArray[] = new int[array.length+1];
for(int i = 0;i<array.length;i++){
newArray[i] = array[i];
}
newArray[newArray.length-1] = num;
array = newArray;
return array;
}
public static int[] partition(int arr[]){
while(arr.length>1){
int pivotIndex = (int)(arr.length/2);
int left[] = new int[0];
int right[] = new int[0];
for(int i = 0;i<arr.length;i++){
if(i==pivotIndex){
continue;
}
else if(arr[i]<=arr[pivotIndex]){
left = addNumberToArray(left,arr[i]);
}
else{
right = addNumberToArray(right,arr[i]);
}
}
int origPivot = arr[pivotIndex];
int k = 0;
while(k<left.length){
arr[k] = left[k];
k++;
}
arr[k] = origPivot;
k++;
while(k<arr.length){
arr[k] = right[k-(left.length+1)];
}
if(left.length>1){
partition(left);
}
if(right.length>1){
partition(right);
}
}
return arr;
}
public static void main(String[]args){
list = partition(list);
for(int i = 0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
但为什么这会陷入循环并且不起作用?我不明白这个代码有什么问题。除了这个效率不高(至少可以说)!但我很固执,想要尝试让它工作无论如何..如果你有任何建议,那将是伟大的! thx提前
好吧,这是新的代码,在调试之后一切似乎工作正常,但是当我想打印新的排序的arr时,它仍然会打印出原始未排序的数组。递归将整个事物转回到它开始的地方。我怎么能让它“保存步骤”?我应该在哪里进行“回复”电话,我应该返回什么?public class MyQuickSort {
public static int list[] = {6,5,3,1,8,7,2,4};
public static boolean sorted;
public static int[] addNumberToArray(int arr[],int num){
int newArr[] = new int[arr.length+1];
for(int i = 0;i<arr.length;i++){
newArr[i] = arr[i];
}
newArr[newArr.length-1] = num;
arr = newArr;
return arr;
}
public static void partition(int arr[]){
while(!sorted){
int pivotIndex = (int)(arr.length/2);
int left[] = new int[0];
int right[] = new int[0];
for(int i = 0;i<arr.length;i++){
if(i==pivotIndex){
continue;
}
else if(arr[i]<=arr[pivotIndex]){
left = addNumberToArray(left,arr[i]);
}
else{
right = addNumberToArray(right,arr[i]);
}
}
int origPivot = arr[pivotIndex];
int k = 0;
while(k<left.length){
arr[k] = left[k];
k++;
}
arr[k] = origPivot;
k++;
while(k<arr.length){
arr[k] = right[arr.length-arr.length-(left.length+1)+k];
k++;
}
if(left.length>1){
partition(left);
}
if(right.length>1){
partition(right);
}
if(left.length<=1&&right.length<=1){
sorted = true;
}
}
}
public static void main(String[] args) {
partition(list);
for(int i = 0;i<list.length;i++){
System.out.print(list[i]+" ");
}
}
}
答案 0 :(得分:1)
你的算法陷入了这个循环
while(k<arr.length){
arr[k] = right[k-(left.length+1)];
}
原因是你没有增加你的k。
尝试
while(k<arr.length){
arr[k] = right[k-(left.length+1)];
k++;
}
答案 1 :(得分:1)
酷!你的实现似乎在逻辑上描绘了quicksort。但是,请注意,不使用其他缓冲区来实现快速排序。它应该在它自己的主数组中排序,递归调用只传递开始和结束边界。使用quicksort逻辑,您的实现更像是mergesort样式。是的,你错过了上述评论者所说的k ++。