快速排序学习

来源:互联网 发布:域名注册机构查询 编辑:程序博客网 时间:2024/06/14 10:48

快速排序:

        1、取要排序的数组的第一个值(可有其它选择)作为比较值,记为k;

        2、将要排序的数组的第一个值的索引记为 i,最后一个值的索引记为 j;

        3、从 j 开始倒序遍历和比较的基准值 k 做比较,如果 j >= k;则 j--;如果 j<k; 将数组中索引为 j 的值赋值给数组中 i 的位置然后 i++ ;

        4、从 i 开始顺序遍历和比较的基准值 k 做比较,如果 i < k; 则 i++ ; 如果 i > k; 将数组中索引为 i 的值赋值给数组中 j 的位置然后 j--;

        5、重复 3、4的操作,直到 i == j结束循环,将比较基准值 k 放到数组的 i 位置中;

        6、完成5之后 基准值 k 所在的位置 i 将原数组分成了两份,i 位置之前的值均小于 k ,i 位置之后的值均大于等于 k ,再将这两个数组进行上述1~5的操作,一直分割直到无法再分割(每个数组中只有一个元素);


代码如下:

public class Quicksort {
    
    private static int num =0;//循环次数
    
    public static int[] quickSort(int[] forSort,int start,int end){
        if(start < end){
            int k = forSort[start];
            int i = start;
            int j = end;
            while(i<j){
                while(i<j && forSort[j]>k){
                    num++;
                    j--;
                }
                if(i<j){
                    forSort[i] = forSort[j];
                    i++;
                }
                while(i<j && forSort[i] < k){
                    num++;
                    i++;
                }
                if(i < j){
                    forSort[j] = forSort[i];
                    j--;
                }
            }
            forSort[i] = k;
            
            System.out.println("分次结果:"+Arrays.toString(forSort)+";i="+i+";j="+j);
            Quicksort.quickSort(forSort,start,i-1);
            
            /*递归调用,把key后面的完成排序*/
            Quicksort.quickSort(forSort,i+1,end);
        }
        
        return forSort;
    }
    
    public static void main(String[] args) {
        int[] array = {2,5,6,8,5,4,6,9,4,9};
        int[] sorts = Quicksort.quickSort(array, 0, array.length-1);
        
        System.out.println("最终结果:"+Arrays.toString(sorts)+",num="+num);
    }
}

结果

分次结果:[2, 5, 6, 8, 5, 4, 6, 9, 4, 9];i=0;j=0
分次结果:[2, 4, 4, 5, 5, 8, 6, 9, 6, 9];i=4;j=4
分次结果:[2, 4, 4, 5, 5, 8, 6, 9, 6, 9];i=2;j=2
分次结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9];i=7;j=7
分次结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9];i=6;j=6
分次结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9];i=9;j=9
最终结果:[2, 4, 4, 5, 5, 6, 6, 8, 9, 9],num=15

0 0
原创粉丝点击