数据结构note11:快速排序


/**
 * instruction of project
 *
 * @author Aruiea.com
 * @ClassName FastSort
 * @Version 1.0
 * @Date 2020/8/2 14:48
 * 快速排序思想:
 * 1.先从数列中取出一个数作为基准数(简单起见就选第一个数)
 * 2.分区过程:将比这个数大的数全放到他的右边,比他小的数全放到他的左边(分治)
 * 3.再对左右两边的区重复第一步和第二部操作,直到各区间只有一个数(递归)
 * 简单来说就是: 快速排序 = 冒泡 + 分治 + 递归
 *
 * 具体实现:
 * 1.以a[0]为基准数
 * 2.设置两个哨兵i,j。i++,j--
 * 3.哨兵j先左移,一直到遇到第一个小于a[0]的数,然后等待i,i向右移动,直到找到一个大于a[0]的数。
 * 然后交换这两个数的值(比他小的在左,比他大的在右)
 * 4.直到i和j相遇时,交换a[0]和此时a[i]的值。
 * 这样就完成了一个以a[0]元素为基准的快速排序。
 * 5.然后对他的左半部分和右半部分分别进行这种操作,最终得到一个有序列表。
 */
public class QuickSort {
    public QuickSort() {
        // TODO Auto-generated constructor stub
    }

    private static void sort(int[] a, int low, int high ){
        //初始化哨兵i和j的值,并以a[0]为基准,保存a[0]的值
        int i = low;
        int j = high;
        int temp = a[low];

        //当low>=high时停止排序,此时只剩下最后一个元素,不需要移动。
        if(i >=j){
            return;
        }

        //如果哨兵i和j没有相遇,就进行排序
        while(i != j){
            //哨兵j先从右至左寻找小于temp的值,j>i很重要
            while(a[j] >= temp && j>i){
                j--;
            }

            //然后等待哨兵i从左至右找到大于temp的值,i<j很重要
            while(a[i] <= temp && i<j){
                i++;
            }

            //哨兵各自找到了元素,并且哨兵i还在哨兵j的左边,就交换他们的值
            if(i < j){
                int flag = a[i];
                a[i] = a[j];
                a[j] = flag;
            }
        }

        //最终i=j(上面循环对这两个元素的关系进行了限定),交换a[i]和a[low]的值
        int flag2 = a[low];
        a[low] = a[i];
        a[i] = flag2;

        //然后分别对他的左边和右边序列进行上述操作。
        sort(a, low, i-1);
        sort(a, i+1, high);

    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[] = new int[]{1,4,7,2,3,6,5,8};
        sort(a, 0, a.length-1);
        for(int k : a){
            System.out.printf(" "+k);
        }
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值