复习一下快速排序
这样操作后,LR相遇点之前的值一定小于K,LR相遇点之后的值一定大于K,可以自行手动验证(#滑稽)。
之后我们可以以相遇点为分界,得到两个子表,这两个子表分别以这种方式进行操作,就可以把无序列变为有序列。本质上是递归。
需要注意的是,我们进行操作的时候必须按照先R后L的顺序才可以正确的递归,而K值一般取data[0]。
在方法设计上,要注意如何递归,我们给LR相遇点的下标取名mid,表总长length,左子表的下标值在0~mid-1,右子表的下标值在mid+1~length-1。所以我们每次递归都要返回mid值,才能正确的递归。
public int getMid(int[] list,int left,int right){
right = right - 1 ;
int key = list[left] ;
while(left < right){
while(left < right && list[right] > key){
right -- ;
}
while(left < right && list[left] < key){
left ++ ;
}
//mid = left ;
int temp = list[left] ;
list[left] = list[right] ;
list[right] = temp ;
}
int temp = list[left] ;
list[left] = key ;
key = temp ;
return left ;
}
每次获取mid的方法完成。
递归方法很简单,只需要在一个方法里调用获取mid的方法即可。
public void sort(int[] list,int left,int right){
int mid = 0 ;
if(left < right){
mid = this.getMid(list,left,right) ;
this.sort(list, 0, mid-1) ;
this.sort(list, mid+1, right) ;
}
}
总体类设计如下:
public class QSort{
private int[] data = null ;
//private int[] array = null ;
public QSort(int[] data,int left,int right){
this.setData(data) ;
this.sort(data, left, right) ;
}
private void setData(int[] data){
this.data = data ;
}
public String getArray(){
String s = "排序后:" ;
for(int i : this.data){
s = s + i + " " ;
}
return s ;
}
public void sort(int[] list,int left,int right){
int mid = 0 ;
if(left < right){
mid = this.getMid(list,left,right) ;
this.sort(list, 0, mid-1) ;
this.sort(list, mid+1, right) ;
}
}
public int getMid(int[] list,int left,int right){
right = right - 1 ;
int key = list[left] ;
while(left < right){
while(left < right && list[right] > key){
right -- ;
}
while(left < right && list[left] < key){
left ++ ;
}
//mid = left ;
int temp = list[left] ;
list[left] = list[right] ;
list[right] = temp ;
}
int temp = list[left] ;
list[left] = key ;
key = temp ;
return left ;
}
}
public class Test {
public static void main(String[] args) {
System.out.println(new QSort(new int[]{7,1,4,2,9,3,8,5,10,6},0,10)
.getArray());
}
}
排序后:1 2 3 4 5 6 7 8 9 10
2025 - 快车库 - 我的知识库 重庆启连科技有限公司 渝ICP备16002641号-10
企客连连 表单助手 企服开发 榜单123