Java 快速排序分区算法在分区方法中定义的循环不变量
我在快速排序算法中实现了分区方法,但我不知道它是否满足给定给我的循环不变量Java 快速排序分区算法在分区方法中定义的循环不变量,java,quicksort,Java,Quicksort,我在快速排序算法中实现了分区方法,但我不知道它是否满足给定给我的循环不变量 public class qs { private qs(){} /** * Sort an array in ascending order * @param arr array to sor */ public static void quickSort(int[] arr){ qs(arr, 0, arr.length); } /** *
public class qs {
private qs(){}
/**
* Sort an array in ascending order
* @param arr array to sor */
public static void quickSort(int[] arr){
qs(arr, 0, arr.length);
}
/**
* Sort a region of an array in ascending order.
* Elements outside the given region are unchanged.
* requires: 0 <= start <= end <= arr.length
* @param arr array to sort
* @param start start of region (inclusive)
* @param end end of region (exclusive)
*/
private static void qs(int[] arr, int start, int end){
if (end <= start+1){ //region of length 0 or 1
return;
}
int x = arr[start];
int p = partition(arr, start+1, end, x);
//now swap arr[start] with arr[p-1]
arr[start] = arr[p-1];
arr[p-1] = x;
qs(arr, start, p-1);
qs(arr, p, end);
}
/**
* Partition a region of an array.
* Rearranges elements in region so that small ones
* all have smaller indexes than the big ones.
* Elements outside the region are unchanged.
* requires: 0 <= start <= end <= arr.length
* @param arr array to partition
* @param start start of region (inclusive)
* @param end end of region (exclusive)
* @param x pivot - "small" and "big" are <x, >=x.
* @return start index (inclusive) of big elements
* in region after partition.
*/
private static int partition(
int[] arr, int start, int end, int x)
{
int l = start-1 ;
int r = end;
while (true) {
while(++l< r && arr[l] < x);
while(r-- > l && arr[r] > x);// find smaller item
if(l >= r) // if pointers cross,
break; // partition done
else {
int temp;
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
}
return l;
}
public static void main(String[] args) {
int[] a = {15,8,4,8,9,6,4,1,2,5,6,4};
quickSort(a);
for (int i = 0; i < a.length; i++){
System.out.print(" "+a[i]);
}
}
}
公共类qs{
私有qs(){}
/**
*按升序对数组排序
*@param arr数组到sor*/
公共静态void快速排序(int[]arr){
qs(arr,0,arr.length);
}
/**
*按升序对数组的区域进行排序。
*给定区域之外的元素不变。
*要求:0除了一个问题外,您的代码应该可以工作。您选择的轴是数组的起点,而不是数组的中点。因此,请改为
int x = arr[start];
你最好把它分配给
int x = arr[(start + end)/2];
你的代码必须工作。我仍然不清楚实际问题是什么…?你有理由相信它不工作吗?@user1795732为了清晰起见,你能在你的问题的某个地方陈述循环不变量吗?/*不变量*开始这是不变量,我不知道我关于分区方法的答案是否满足它我知道它工作,但是也应该满足不变量,我不知道关于划分方法的不变量是否满足,或者至少如何识别它满足。/*不变量*开始