首页 > 编程语言 > 详细

快速排序

时间:2020-06-29 18:24:19      阅读:67      评论:0      收藏:0      [点我收藏+]

问题:

Input:
s = 7, nums = [5,3,1,7,5,20,2,4,3,2,2,1,2,4,3]
Output:
[1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 7, 20]
/*
例子:
3,8,7,1,2
2,8,7,1,3
2,3,7,1,8
2,1,7,3,8
2,1,3,7,8
    
1,2,3,7,8
*/

状态码朴素写法:

import java.util.Arrays;

public class test {
    public static void main(String[] args) {
        int[] nums= {5,3,1,7,5,20,2,4,3,2,2,1,2,4,3};
        quicklySort(nums,0,nums.length-1);
        //Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
    }
    public static int[] quicklySort(int[] nums,int prefix,int suffix) {
        //问题出在相同元素时不好判断//解决:相同的时候将其向前移或后移
        //问题出在换了一次之后,交换的顺序错误//解决:加入状态码
        int tempprefix=prefix;
        int tempsuffix=suffix;
        int status=0;
        if (prefix==suffix) return nums;
        
        while (prefix<suffix) {
            if (nums[prefix]>nums[suffix]) {
                swap(nums,prefix,suffix);
                status=status^1;//第一次交换状态为1
                if (status==1) {
                    prefix++;
                }else {
                    suffix--;
                }
            } else {
                if (status==1) {
                    prefix++;
                }else {
                    suffix--;
                }
            }
        }
        if (prefix==suffix) {
            quicklySort(nums, tempprefix,prefix-1);
            quicklySort(nums, suffix+1, tempsuffix);
        }
        return nums;
    }
    public static void swap(int[] nums,int prefix,int suffix) {
        int temp=nums[prefix];
        nums[prefix]=nums[suffix];
        nums[suffix]=temp;
    }
}

中值无状态码写法:

import java.util.Arrays;

public class test {
    public static void main(String[] args) {
        int[] nums= {5,3,1,7,5,20,2,4,3,2,2,1,2,4,3};
        nums=quicklySort(nums,0,nums.length-1);
        System.out.println(Arrays.toString(nums));
        
    }

    public static int[] quicklySort(int[] nums,int prefix,int suffix) {
        
        int centervalue=nums[(prefix+suffix)>>1];
        if (prefix>=suffix) return nums;
        
        int tempprefix=prefix-1;
        int tempsuffix=suffix+1;
        
        while (tempprefix<tempsuffix) {
            do {tempprefix++;} while (centervalue>nums[tempprefix]);
            do {tempsuffix--;} while (centervalue<nums[tempsuffix]);
            if (tempprefix<tempsuffix) {
                int temp=nums[tempprefix];
                nums[tempprefix]=nums[tempsuffix];
                nums[tempsuffix]=temp;
            }
        }
        //System.out.println(Arrays.toString(nums));
        quicklySort(nums, prefix,tempprefix-1);
        quicklySort(nums, tempsuffix+1, suffix);
        
        return nums;
    }
}

户枢不蠹,流水不腐

快速排序

原文:https://www.cnblogs.com/yunianzeng/p/13209147.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!