思想:
通过一个数组划分成两个子数组,然后通过递归调用把每个数组进行再分,直到排序完成。
划分:通过在数组中找到一个关键字,进行划分 小的都在左边,大的都在右边,
1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;
2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];
3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;
4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;
5)、重复第3、4步,直到I=J;
程序执行过程数字变化是这样的
49 38 65 97 76 13 27
第一个数字以49为key
先从最右边找比49小的 27符合 因为左边第一个就是49 49=49 所以在49这里卡住了 等着右边来换 所以 array[start]=array[end]; 变成了
27 38 65 97 76 13 27
这时候右边找比49小的 27并没有赋值 等着左边找到一个比49大的转换位置 找到65 然后 array[end]=array[start]; 所以数字顺序变成了
27 38 65 97 76 13 65
以此类推 左边赋完值 左边这个就比49大 所以卡住了 然后在右边找比49小的值 找到13 array[start]=array[end]; 变成了
27 38 13 97 76 13 65
然后 右边卡住 再从左边找 变成了 27 38 13 97 76 97 65
然后 左边卡住 再从右边找比49小的 没有找到 start=3 end=3
然后再把key值赋值给arr[end] 所以第一次排序完顺序是 27 38 13 49 76 97 65
再进行递归….
public class sort {
public static void main(String[] args) {
int[] arr = new int[]{44,55,11,22,14,78};
sort(arr,0,arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}
public static void sort(int[] array,int start ,int end){
if(start>=end){
return ;
}
int index=partition(array,start,end);
sort(array,start,index-1);
sort(array,index+1,end);
//通过递归调用
}
public static int partition(int []array,int start ,int end){
//固定的切分方式
int key=array[start];
while(start<end){
while(array[end]>=key&&end>start){//从后半部分向前扫描
end--;
}
array[start]=array[end];
while(array[start]<=key&&end>start){//从前半部分向后扫描
start++;
}
array[end]=array[start];
//别以为这里错了 其实这里面都有两个一样的数字 每次的key值都被别的替代了 等到后面会把最后key应该待的地方赋值成key的值 (因为每次转换地方太麻烦了
}
array[end]=key;
return end;
}
}