排序方法-快速排序

快速排序是一种时间复杂度为O(NlogN)的排序算法,其基本思想是:通过一趟排序将待排记录划分为独立的两部分,成为前半区和后半区,其中,前半区记录的关键字均不大于后半区的关键字,然后分别对这两个区进行快速排序,从而使整个序列有序。

一趟排序的具体做法:设两个位置指示变量i和j,他们的初值分别指向序列的第一个记录和最后一个记录,设参考值(通常是第一个记录)的关键字为pivot,则首先从j所指示的位置向左搜索,找到第一个关键字小于pivot的记录时将这个记录向前移动到i所指示的位置,然后从i所指示的位置向右搜索,找到第一个关键字大于pivot的记录时将该记录后移到j所指示的位置,重复i与j直到相等为止。

public class quickSort {
    public static void main(String[] args) {
        int[] nums = new int[]{1,6,3,2,7,1,9,0,3,15};
        quickSortTest(nums );
        for(int x:nums) System.out.print(x+" ");
    }
    public static void sort(int[] array,int left, int right){
        if(left >= right) return; //如果少于一个数字
        int pivot = array[left]; //一般选择第一个数字为参考值
        int i = left;
        int j = right;
        while(i < j && array[j] >= pivot) j--; //先从右往左数,直到遇到比参考值小的数终止
        while(i < j && array[i] <= pivot) i++;//从左往右数,直到遇到比参考值大的数终止
        if(i < j){
            int temp = array[i]; //交换位置
            array[i] = array[j];
            array[j] = temp;
        }
        array[left] = array[i]; //参考值放在中间
        array[i] = pivot;
        sort(array,left,i-1); //左边数列进一步快速划分
        sort(array,i+1,right);//右边数列进一步划分
    }
    public static void quickSortTest(int[] nums){
        int len;
        if(nums == null
                || (len = nums.length) == 0
                || len == 1) {
            return ;
        }
        sort(nums, 0, len - 1);
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值