Java 快速排序可删除某些条件 publicstaticvoidquicksort(整数[]arr,int-low,int-high) { //检查空数组或空数组 如果(arr==null | | arr.length==0){ 返回; } 如果(低>=高){ 返回; } //从列表中间获取pivot元素 int middle=低+(高-低)/2; int pivot=arr[中间]; //使左枢轴 int i=低,j=高; 而(我) { j--; } //现在比较列表两侧的值,看看它们是否需要交换 //交换后,在两个列表上移动迭代器 //第(1)号 如果(i){ 快速排序(arr、i、高); } }
我是快速排序算法的初学者。有人能告诉我,在上面的快速排序算法中,条件if number(1)、if number(2)和if number(3)的用途是什么吗 对于数字(1),我觉得这个条件是不必要的,因为我肯定会小于或等于j,因此交换应该只执行Java 快速排序可删除某些条件 publicstaticvoidquicksort(整数[]arr,int-low,int-high) { //检查空数组或空数组 如果(arr==null | | arr.length==0){ 返回; } 如果(低>=高){ 返回; } //从列表中间获取pivot元素 int middle=低+(高-低)/2; int pivot=arr[中间]; //使左枢轴 int i=低,j=高; 而(我) { j--; } //现在比较列表两侧的值,看看它们是否需要交换 //交换后,在两个列表上移动迭代器 //第(1)号 如果(i){ 快速排序(arr、i、高); } },java,algorithm,quicksort,Java,Algorithm,Quicksort,我是快速排序算法的初学者。有人能告诉我,在上面的快速排序算法中,条件if number(1)、if number(2)和if number(3)的用途是什么吗 对于数字(1),我觉得这个条件是不必要的,因为我肯定会小于或等于j,因此交换应该只执行 对于数字(2)和数字(3),其解释类似。如果我错了,请纠正我,谢谢第1个-前两个for循环只需检查要交换的右元素(从左侧和右侧),因此当计算i和j索引位置时,此条件查看它们是否处于需要交换的位置(因为隐含的一个大于另一个) 数字2和3-这是“分治算法”
对于数字(2)和数字(3),其解释类似。如果我错了,请纠正我,谢谢第1个-前两个
for
循环只需检查要交换的右元素(从左侧和右侧),因此当计算i
和j
索引位置时,此条件查看它们是否处于需要交换的位置(因为隐含的一个大于另一个)
数字2和3-这是“分治算法”的一部分,这部分只是将阵列分成两个较小的部分
看一看(来源)你能给我一个无序数组元素的样本来证明我可以大于j,它错误地执行了交换,这样我就可以可视化了。感谢你,事实上,正如目前所写的那样,
我理解分而治之的方法。但是,我觉得我总是小于j,小于j,小于j,大于i。因此或者,没有必要提出这些条件。如果可能,请给我一个反例来反驳这一点。谢谢,对不起,这不是正确的方法。我建议你一步一步地调试这段代码并研究算法,有大量的文档、帖子和视频详细解释了这一点。快速排序中的pivot思想是一个突破通过这一点,让这个算法比其他算法更好。
public static void quickSort(Integer[] arr, int low, int high)
{
//check for empty or null array
if (arr == null || arr.length == 0){
return;
}
if (low >= high){
return;
}
//Get the pivot element from the middle of the list
int middle = low + (high - low) / 2;
int pivot = arr[middle];
// make left < pivot and right > pivot
int i = low, j = high;
while (i <= j)
{
//Check until all values on left side array are lower than pivot
while (arr[i] < pivot)
{
i++;
}
//Check until all values on left side array are greater than pivot
while (arr[j] > pivot)
{
j--;
}
//Now compare values from both side of lists to see if they need swapping
//After swapping move the iterator on both lists
//NUMBER (1)
if (i <= j)
{
swap (arr, i, j);
i++;
j--;
}
}
//Do same operation as above recursively to sort two sub arrays
//NUMBER (2)
if (low < j){
quickSort(arr, low, j);
}
//NUMBER (3)
if (high > i){
quickSort(arr, i, high);
}
}