排序算法:(一)快速排序

这里写图片描述

public class Demo {
    /**
     * 快速排序是在排序算法中最快的算法
     * 快速排序:
     * 通过一趟排序将要排序的数据分割成独立的两部分
     * 其中一部分数据要都比另外一部分的所有数据小
     * 然后按照此方法对部分进行排序,依次递归进行以达到目的。
     * 假设,用户输入了以下数组:
     * 下标: 0  1  2  3  4  5
     * 数字: 6  2  7  3  8  9
     * 定义i=0;(指向第一个数),定义j=5;(指向最后一个数据),定义中间变量k,把第一个数据赋值给k。
     * 第一次比较要把所有比k小的移到K的左边,所以要寻找比6小的数,从右往左,从j开始,不断递减j的值。
     * 找到了第一个下标为3的数字3比6小,于是把数字3移到下标0的位置,把下标为0的数字6移到下标为3的位置上,完成第一次比较
     * 下标: 0  1  2  3  4  5
     * 数字: 3  2  7  6  8  9
     * 此时i=0;j=3;k=6。
     * 接着开始第二次比较,这次要寻找比K大的数,并且要从左往右找。递加变量i,发现下标为2的数据是第一个比K大的。
     * 于是用下标为2的数据7和j指向的数据交换。
     * 下标: 0  1  2  3  4  5
     * 数字: 3  2  6  7  8  9
     * 此时i=2;j=2;k=6
     * 以上两次循环称为一次循环。
     * 接着,再次重复上面的第一次循环操作,递减变量j;递减i...;不断重复进行上面的循环
     * 
     * 在本例中我们进行一次循环,就发现i与j相等了,他们都指向了下标2。于是,第一遍比较结束。
     * 下标: 0  1  2  3  4  5
     * 数字: 3  2  6  7  8  9
     * 此时我们发现作为i与j碰头下标所指向的中间变量6,右边都比6小;左边都比6大。
     * 
     * 要是i和j没有碰头的话。就会一直递加i找大的,再没有,就再递减j找小的。如此循环不断往复。
     * 注意判断和寻找是同时进行的。
     * 
     * 第一遍快速排序不会导致最终的结果,只会把比K大的移到左边,比k小的移到右边。
     * 为了得到最终结果,需要再次对两边的数组分别进行快速排序,直到数组不能再分解为止。
     */
    private static void sort(int[] arr,int left,int right) {  
        /*低位置起始点*/  
        int low = left;  
        /*高位置起始点*/  
        int hight = right;  
        /*要比较的数据为低位置起始点的值*/  
        int data = arr[low];  
        while (low < hight) {  
            while(low < hight&&arr[hight] >=data){  
                hight--;  
            }  
            /*把比它小的放左边,因为low最终为data*/  
            if (low<hight) {  
                 arr[low]=arr[hight];  
                /*因为我跟你比较过了所以下次不比较了,加一*/  
                low++;  
            }  
            while(low < hight&&arr[low]<= data){  
                low++;  
            }  
            /*把比它大的放右边*/  
            if (low<hight) {  
                arr[hight] = arr[low];  
                /*因为我跟你比较过了所以下次不比较了,减一*/  
                hight--;  
            }  
        }  
        /*注意下标为low最终为data*/  
        arr[low]=data;  
        /*因为在data右边都比data大,所以现有data的右边在下一次排序时候不需要再排了*/  
        if(low>left){  
            sort(arr,left,hight-1);  
        }  
        /*因为在data左边都比data小,所以现有data的左边边在下一次排序时候不需要再排了*/  
        if(hight<right){  
            sort(arr,low+1,right);  
        }  
    }  

    public static void sort(int[] arr){  
        sort(arr,0,arr.length-1);  
    } 

    public static void main(String[] args) {
        int [] arr={3,9,6,1,8,7,5,0};
        Demo.sort(arr);
        System.out.println(Arrays.toString(arr));

    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值