快速排序

1.指针交换法

package quickSort;

import java.util.Arrays;

public class QuickSort1 {
    public static void quickSort(int[] arr) {
        int startindex = 0;
        int endindex = arr.length-1;
        //递归结束标识
        if(startindex>=endindex) {
            return;
        }
        //得到基准元素位置
        int partitionindex = partition1( arr, startindex, endindex);
        //分治法递归数列两部分
        quickSort(arr,startindex,partitionindex-1);
        quickSort(arr,partitionindex+1,endindex);
    }
    public static void quickSort(int[] arr,int startindex,int endindex) {
        //递归结束标识
        if(startindex>=endindex) {
            return;
        }
        //得到基准元素位置
        int partitionindex = partition( arr, startindex, endindex);
        //分治法递归数列两部分
        quickSort(arr,startindex,partitionindex-1);
        quickSort(arr,partitionindex+1,endindex);
    }

    private static int partition1(int[] arr,int startindex,int endindex) {
        //取基准元素位置
        int pivot = arr[startindex];
        int left = startindex;
        int right = endindex;

        while(left<right) {
            //控制right指针左移
            while(left<right&&arr[right]>pivot) {
                right--;
            }
            //控制left指针右移
            while(left<right&&arr[left]<=pivot) {
                left++;
            }
            if(left<right) {
                arr[left] = arr[left]^arr[right];
                arr[right] = arr[left]^arr[right];
                arr[left] = arr[left]^arr[right];

            }
        }
        //控制重合点与pivot交换 
        arr[left] = arr[left]^arr[startindex];
        arr[startindex] = arr[left]^arr[startindex];
        arr[left] = arr[left]^arr[startindex];
        System.out.println(Arrays.toString(arr)+"--->"+right);
        return (right);
    }

    private static int partition(int[] arr,int startindex,int endindex) {
        //取基准元素位置
        int pivot = arr[startindex];
        int left = startindex;
        int right = endindex;

        while(left<right) {
            //控制right指针左移
            while(left<right&&arr[right]>pivot) {
                right--;
            }
            //控制left指针右移
            while(left<right&&arr[left]<=pivot) {
                left++;
            }
            if(left<right) {
                arr[left] = arr[left]^arr[right];
                arr[right] = arr[left]^arr[right];
                arr[left] = arr[left]^arr[right];

            }
        }
        //控制重合点与pivot交换 
        /*此处出现问题不知道什么原因,期待大神的指导=-=
        arr[left] = arr[left]^arr[startindex];
        arr[startindex] = arr[left]^arr[startindex];
        arr[left] = arr[left]^arr[startindex];*/
        int b = arr[startindex];
        arr[startindex] = arr[right];
        arr[right] = b;

        System.out.println(Arrays.toString(arr)+"--->"+right);
        return (right);
    }
    public static void main(String[] args) {
        int[] arr = {7,5,6,2,3,4,9,8};
        Arrays.sort(arr);
        //System.out.println(Arrays.toString(arr));
        int[] arr1 = {4,7,6,5,3,2,8,1};
        quickSort(arr1,0,arr.length-1);
        System.out.println(Arrays.toString(arr1));
        int[] arr2 = {4,7,6,5,3,2,8,1};
        quickSort(arr2);
        System.out.println(Arrays.toString(arr2));
    }
}

2.挖坑法

package quickSort;

import java.util.Arrays;

public class QuickSort {
    public static void quickSort(int[] arr,int startindex,int endindex) {
        //递归结束标识
        if(startindex>=endindex) {
            return;
        }
        //得到基准元素位置
        int partitionindex = partition( arr, startindex, endindex);
        //分治法递归数列两部分
        quickSort(arr,startindex,partitionindex-1);
        quickSort(arr,partitionindex+1,endindex);
    }
    private static int partition(int[] arr,int startindex,int endindex) {
        //取基准元素位置
        //int pivot = arr[(int) ((endindex-startindex)*Math.random())];
        int pivot = arr[startindex];
        int left = startindex;
        int right = endindex;

        //坑的位置,初始为pivot位置
        int index = Arrays.binarySearch(arr, pivot);
        while(left<=right) {

            //right指针从右往左进行比较
            while(left<=right) {
                if(arr[right]<=pivot) {
                    arr[left] = arr[right];
                    index = right;
                    left++;
                    break;
                }
                right--;
            }
            while(left<=right) {
                if(arr[left]>=pivot) {
                    arr[right] = arr[left];
                    index = left;
                    right--;
                    break;
                }
                left++;
            }
            //left指针从左往右进行比较
        }
        arr[index] = pivot;
        System.out.println(Arrays.toString(arr)+"--->"+index);
        return index;
    }
    public static void main(String[] args) {
        //int[] arr = {1,2,3,5,4,7,6,8};
        int[] arr = {4,5,7,6,3,2,9,8};
        quickSort(arr,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
        Arrays.sort(arr);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值