Advance_quicksort:打印分区/插入的每个步骤
我已经学习并编码了QuickSort(),partition()和insertionsort()本人,因此能够运行代码并正确排序数组,但是如果我想在Java中打印并显示“ Sort Algorithms”的每个步骤,该怎么办?
***需求:
***使用QuickSort结合Insertionsort以提高效率。 如果由枢轴差异的左/右子阵列的元素低于3(a [0..n-1],n< = 3),
*** => use insertionsort()
输出应该像这样:
<BEFORE SORTING>:[10, 4, 2, 8, 7, 3, 5, 9, 6, 1]
use_partition:[1, 4, 2, 8, 7, 3, 5, 9, 6, 10]
use_partition:[1, 3, 2, 4, 7, 8, 5, 9, 6, 10]
use_insertion:[1, 2, 3, 4, 7, 8, 5, 9, 6, 10]
use_partition:[1, 2, 3, 4, 5, 6, 7, 9, 8, 10]
use_partition:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
<AFTER SORTING>:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
我想通过Java打印步骤,使实现更清楚,我的第一个想法是使用某些条件循环,有人知道我在哪里可以找到相对的文章?多谢。
抱歉,这是我写的代码:
import java.util.Arrays;
public class Main{
public static void main(String args[]){
int[] array1 = {10, 4, 2, 8, 7, 3, 5, 9, 6, 1};
int n1 = array1.length;
System.out.print("Before sorting is: ");
System.out.println(Arrays.toString(array1));
System.out.print("After sorting is: ");
Quicksort(array1, 0, n1-1);
/*
the display loop I need
*/
} //end main()
public static void Quicksort(int[] array, int start, int end){
if(start<end){
if(end-start <=3){
InsertionSort(array, start, end);
}else{
int pivot = HoarePartition(array, start, end);
Quicksort(array, start, pivot);
Quicksort(array, pivot+1, end);}
}
}
} //end Quicksort()
public static void swapIJ(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
} //end swapIJ
public static int HoarePartition(int[] array, int start, int end){
int pivot = array[start];
int i = start -1 ;
int j = end + 1;
while(true){
do{i++;}while(array[i] < pivot);
do{j--;}while(array[j] > pivot);
if(i>=j)
return j;
swapIJ(array, i, j);
} //end while
} //end HoarePartition()
public static void InsertionSort(int[] array) {
for(int i = 1; i < array.length; i++) {
int temp = array[i];
int j = i - 1;
while(j >= 0 && array[j] > temp) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = temp;
} //end for
} //end InsertionSort()
I've learned and coded QuickSort(), Partition() and InsertionSort() myself, hence be able to run the code and sort arrays correctly, but what if I want to print in java and show every single steps the SORT algorithms do?
***Demand:
***Use QuickSort combines InsertionSort to enhence the efficiency.
If the amount of element of left/right subArray which devided by pivot is below 3(A[0..n-1], n<=3),
***=>use InsertionSort()
The output should be like this:
<BEFORE SORTING>:[10, 4, 2, 8, 7, 3, 5, 9, 6, 1]
use_partition:[1, 4, 2, 8, 7, 3, 5, 9, 6, 10]
use_partition:[1, 3, 2, 4, 7, 8, 5, 9, 6, 10]
use_insertion:[1, 2, 3, 4, 7, 8, 5, 9, 6, 10]
use_partition:[1, 2, 3, 4, 5, 6, 7, 9, 8, 10]
use_partition:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
<AFTER SORTING>:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
I would like to print the steps by java making the implementation more clearly, my first thought is to use some conditional loop, does anyone know where can I find the relative article? Thanks a lot.
Sorry, here's the code I wrote:
import java.util.Arrays;
public class Main{
public static void main(String args[]){
int[] array1 = {10, 4, 2, 8, 7, 3, 5, 9, 6, 1};
int n1 = array1.length;
System.out.print("Before sorting is: ");
System.out.println(Arrays.toString(array1));
System.out.print("After sorting is: ");
Quicksort(array1, 0, n1-1);
/*
the display loop I need
*/
} //end main()
public static void Quicksort(int[] array, int start, int end){
if(start<end){
if(end-start <=3){
InsertionSort(array, start, end);
}else{
int pivot = HoarePartition(array, start, end);
Quicksort(array, start, pivot);
Quicksort(array, pivot+1, end);}
}
}
} //end Quicksort()
public static void swapIJ(int[] array, int i, int j){
int temp = array[i];
array[i] = array[j];
array[j] = temp;
} //end swapIJ
public static int HoarePartition(int[] array, int start, int end){
int pivot = array[start];
int i = start -1 ;
int j = end + 1;
while(true){
do{i++;}while(array[i] < pivot);
do{j--;}while(array[j] > pivot);
if(i>=j)
return j;
swapIJ(array, i, j);
} //end while
} //end HoarePartition()
public static void InsertionSort(int[] array) {
for(int i = 1; i < array.length; i++) {
int temp = array[i];
int j = i - 1;
while(j >= 0 && array[j] > temp) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = temp;
} //end for
} //end InsertionSort()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如注释中所建议的,您可以在
QuickSort
方法的每个呼叫中放置system.out.println(arrays.toString(array))
。这将在每个分类迭代时打印您的数组状态。例如,在您的代码中,它可以在返回之前将其放置在
HoarePartition
方法中。As suggested in the comments, you could place a
System.out.println(Arrays.toString(array))
at every call of yourquicksort
method. This will print the state of your array at every sorting iteration.For example, in your code it could be placed in the
HoarePartition
method right before returning.