クイックソートについては、次の記事を参照することができます:
注:為替の性質は、ちょうど2つが一つだけの交換に合併交換し、穴を埋める穴を埋めることです。
私はまた、ソートのコード午前:
満たされたピット
public void quickSort(int[] nums,int low,int high){
/*
* 由于快速排序需要递归,递归的每层作用的数据结构其实是原数组上的一部分,所以参数中引入low和high
* 本快速排序中关于元素位置的调整使用填坑法。
*/
if(low<high){
//只有low<high时,才进行排序;否则,low==high说明是单个元素,不排序
int curr = nums[low];//记录主元
int i = low;
int j = high;
while(i<j){
/*
* 主元选最左侧元素时,先移动右指针,这是基于最后i==j的情况设计的。
* 试想,上次i的停留位置,被交换过来一个小于主元的元素,
* 当j--移动到i==j循环结束时,此时i、j共同指向的这个元素是i之前指向的一个比主元小的元素,
* 因此可以理所应当地将其与位于最左边的主元进行交换。
* 同理,当主元选最右侧元素时,先移动的应该是左指针。
*/
while(i<j && nums[j]>=curr){
j--;
}
if(i<j){
//找到一个比主元小的右侧元素,填上一个坑
nums[i] = nums[j];
i++;
}
while(i<j && nums[i]<curr){
i++;
}
if(i<j){
//找到一个比主元大的左侧元素,填上一个坑
nums[j] = nums[i];
j--;
}
}
//i==j,指向主元的最终位置,用主元填这个坑
nums[i] = curr;
//分治策略
quickSort(nums,low,i-1);
quickSort(nums,i+1,high);
}
}
為替
public void quickSort(int[] nums,int low,int high){
/*
* 由于快速排序需要递归,递归的每层作用的数据结构其实是原数组上的一部分,所以参数中引入low和high
* 本快速排序中关于元素位置的调整使用交换法。
*/
if(low<high){
//只有low<high时,才进行排序;否则,low==high说明是单个元素,不排序
int i=low;
int j=high;
int curr=nums[low];//记录主元
while(i<j){
/*
* 主元选最左侧元素时,先移动右指针,这是基于最后i==j的情况设计的。
* 试想,上次i的停留位置,被交换过来一个小于主元的元素,
* 当j--移动到i==j循环结束时,此时i、j共同指向的这个元素是i之前指向的一个比主元小的元素,
* 因此可以理所应当地将其与位于最左边的主元进行交换。
* 同理,当主元选最右侧元素时,先移动的应该是左指针。
*/
while(i<j && nums[j]>curr){
j--;
}
while(i<j && nums[i]<=curr){
i++;
}
if(i<j){
//将主元最终位置左侧比主元大的元素与右侧比主元小的元素进行交换
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
//将主元与最终位置上的元素位置互换
nums[low] = nums[i];
nums[i] = curr;
//分治策略
quickSort(nums,low,i-1);
quickSort(nums,i+1,high);
}
}
性能比較
次のように912個の質問のLeetcodeは、2つの方法が提出された、パフォーマンスは次のとおりです。