排序中的快速排序

思想:
通过一个数组划分成两个子数组,然后通过递归调用把每个数组进行再分,直到排序完成。
划分:通过在数组中找到一个关键字,进行划分 小的都在左边,大的都在右边,
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;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值