好吧,快排

写了个快排,思路比较简单:
思想:分治思想,即对一个大问题分割成几部分(一般而言分割两部分)
条件:数组
根据分治思想,对数组进行分割,需要一个标准pivot,此pivot一般都有专门的算法,且因为选择此pivot会影响数组快排的质量——速度。在此选择快排数组首地址位为pivot。对数组分割成两部分,左边部分为小于pivot的数据,右边部分为大于pivot的数据。依次作为递归的前次。
然后对左右两部分数组再次执行此操作。
1.这里为了减少交换次数,所以把pivot单独保存出来,为key;
2.循环遍历
1)首先从右往左遍历,找出小于key值的数据,交换数组i和j位置上的数据;
2)交换后从左往右遍历,找出大于key值的数据,交换数组i和j位置上的数据;
3.循环后i值为key所在数组地址,交换后,对左右两部分数组再快排。

相对较为重要的一点:i值
由于交换过程中,每次交换过后,i地址即为所对应的key值。

public void sort(int[] array,int left,int right){
        if(left>right) return;
        int len = right-left+1;
        if(len==1) return;//判断数组长度
        int i=left,j=right;
        int key = array[left];
        while(i<j){
            while(j>i && array[j]>key){
                j--;
            }
            if(i<j){
                array[i] = array[j];
                i++;
            }
            while(i<j && array[i]<key){
                i++;
            }
            if(i<j){
                array[j] = array[i];
                j--;
            }
        }
        array[i] = key;
        sort(array,left,i-1);
        sort(array,i+1,right);
    }
点赞