快速排序(JAVA)

递归思想:先选数组第一个值作为枢轴,将比枢轴大的值放在右边,比枢轴小的值放在左边。再把中枢左右两侧的两个数组执行相同操作,直到要执行的数组只有一个元素时停止。

对枢轴左右值换位置的操作:双指针法,low,high分别指向数组的最左和最右,初始low指向枢轴。移动high找到比枢轴小的元素,停止移动并交换low、high指针所指的元素,此时high指向枢轴。再移动low找到比枢轴大的元素,停止移动并交换low、high指针所指的元素,此时low指向枢轴(与初始情况相同),交替执行上述操作直到low==high。这里的程序如下:

while(low < high){
    while(low < high && n[high] >= n[low])
        high--;
    swap(n, low, high);
    while(low < high && n[low] <= n[high])
        low++;
    swap(n, low, high);
}

交换之后low==high。返回low值进行递归操作。注意交换的函数要引入数组n作形参才能真正完成数据的交换。

所有程序:

package Algorithms;

public class KuaisuSort {
    public static void main(String[]args){
        int[] n = {32, 2, 322, 5, 1242, 8, 12};
        for(int i: n){                      //打印原顺序数据
            System.out.print(i + "\t");
        }
        System.out.println();
        qSort(n, 0, n.length - 1);
        for(int i: n){                      //打印排序后数据
            System.out.print(i + "\t");
        }
    }
    public static void qSort(int[] n, int low, int high){
        if(low < high){
            int pivot = partition(n, low, high);
            qSort(n, low, pivot-1);
            qSort(n, pivot+1, high);
        }
    }
    public static int partition(int[] n, int low, int high){
        while(low < high){
            while(low < high && n[high] >= n[low]) //从右侧开始找小于pivotkey的值跳出循环,右侧大于等于pivotkey的值不需要改变位置
                high--;
            swap(n, low, high);                      //将右侧小于pivotkey的值与privotkey交换,此时privotkey被交换到了high
            while(low < high && n[low] <= n[high])  //从左侧开始找大于pivotkey的值跳出循环,左侧小于等于pivotkey的值不需要改变位置
                low++;
            swap(n, low, high);                      //将左侧大于privotkey的值与high也就是privotkey交换,此时privotkey被交换到了low
        }
        return low;                                  //此时low=high是privotkey的位置
    }
    public static void swap(int[] n, int p, int q){
        if(p != q){
            n[p] = n[p] ^ n[q];
            n[q] = n[p] ^ n[q];
            n[p] = n[p] ^ n[q];
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值