Java排序之快速排序

快速排序的思想:快速排序是冒泡排序的升级版本,他的基本思想是分而治之、迭代;

一、排序步骤:

1、先选一个基准元素(一般是数组的最后一个元素),一这个基准元素为基准对剩下的元素依次进行比较,对于比基准元素小的元素,放到基准元素的左边,比基准元素大的元素放到基准元素的右边,这样经过一轮排序之后基准元素左边的元素比基准元素都要小,基准右边的元素都比基准元素大,再对基准元素左边和右边做同样的比较操作,一直迭代直到最后剩一个元素;

二、模拟图:

三、 示例:

待排序数组:int array = {7,3,4,2,3}

1、选取基准元素:3,比基准元素3小的元素个数n默认为0(即默认所有的元素都比3大)

2、比较7和3的值,很明显7>3,所以n=0不变;

3、比较3和3的值,3=3,n=0不变;

4、比较4和4的值,4>3,n=0不变

5、比较2和3的值,2<3,调换a[n]=a[0]=7和2的值,同时n++=1,此时数组变成{2,3,4,7,3}

6、一轮比较结束此时调换a[n]=a[1]=3和基准元素3的值,此时数组变成{2,3,4,7,3}

7、再进行下一轮排序重复步骤1但是基准排序数组改变了,1个数组变成了2个{2}和{4,7,3},对这2个数组进行迭代排序知道剩一个元素位置;

因为子数组{2}只有一个元素,所以迭代结束,而{4,7,3}在经过一轮排序后变成{3,4,7},此时在对{4,7}进行排序变成{4,7},所以最后的结果{2,3,3,4,7}

四、java实现:

package eureka.server.paixu;

import java.util.Arrays;

public class QuickSort {


    public static int splitSort(int arr[], int start, int end){
        //比较的基准值,取最后一个值
        int base = arr[end];
        //比较的开始下表,从start开始
        int n = start;
        for(int i = start; i < end; i++){
               //如果数组值小于基准值
                if(arr[i] < base){
                    exchange(arr,i,n);
                    n++;
                }
        }
        //循环结束,替换base和
        exchange(arr, n, end);
        return n;
    }

    public static int partArr(int[] arr, int start, int end) {
        //选取基准元素,这里我们以最后一个位置,作为基准
        int base = arr[end];
        //记录,比基准元素小的变量,这里我们假设要比较的元素都不小于基准元素,这样通过比较
        //就把小于基准元素的数据全部找到,n=start表示的就是默认没有小于基准元素。
        int n = start;
        //基准元素不参与遍历比较
        for (int i = start; i < end; i++) {
            if (arr[i] < base) {
                exchange(arr, i, n);
                n++;
            }
        }
        //遍历完成之后,将基准元素放到应该的位置上
        exchange(arr, n, end);
        return n;
    }


    public static void quickSort(int arr[], int start, int end){
        if(end <= start)
            return;
        int n = splitSort(arr, start ,end);
        if(n==start){
            quickSort(arr,start+1, end);
        }else if(n==end){
            quickSort(arr,start, end-1);
        }else {
            quickSort(arr,start, n-1);
            quickSort(arr,n+1, end);
        }
    }

    /**
     * 交换数组a位置和b位置的值
     * @param arr
     * @param a
     * @param b
     */
    public static void exchange(int arr[], int a, int b){
          int tmp = arr[a];
           arr[a] = arr[b];
           arr[b] = tmp;
    }

    public static void main(String[] args) {
       //int[] arr = {7,3,4,2,3};
        int[] arr = {9,8,7,3,4,1,2,3};
        quickSort(arr,0, arr.length-1);
        System.out.println(Arrays.toString(arr));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值