快速排序实现

【2020假期复习】

一组数据,

 3 5 8 1 2 6 9 4 7 6

预期用快速排序的过程如下:(以最末索引为pivot)


 3 5 8 1 2 6 9 4 7 6
② 3 5 4 1 2 6 9 8 7 6   //交换8 、4
③3 5 4 1 2 6 6 8 7 9   //交换9、6
④交换 3 5 4 1 2 6 结果不变
⑤交换3 5 4 1 2
 1 5 4 3 2  //交换3、1
 1 2 4 3 5  //交换5、2
⑥start sort :1
 start sort :4 3 5
 start sort :4 3
  3 4  //交换4、3

start sort : 4
⑦start sort :8 7 9
start sort : 8 7
 7 8 //交换8、7

start sort :
 8

result is: 1 2 3 4 5 6 6 7 8 9

 

以下为实现:(此法不会更改相同value的相对顺序)

import java.io.*;
import java.util.*;

class FastSort
{


    public static void main(String[] args) throws Exception {
        int[] array={3,5,8,1,2,6,9,4,7,6};
        sort(array,0,array.length-1);
        println(array);
    }

    private static void println(int[] arr)
    {
        for(int i:arr)
            System.out.print(" "+i);
        System.out.println();
    }

    public static boolean sort(int[] src,int leftArg,int rightArg) throws Exception
    {
        System.out.println("start sort :");
        println(src);

        if(src.length==1)
            return true;

        if(leftArg>=src.length-1||rightArg<leftArg)
            return true;

        //副本
        int[] array=new int[src.length];
        System.arraycopy(src,0,array,0,src.length);

        int pivot=array[array.length-1];
        int left=leftArg;
        int right=rightArg;

        while(left<array.length)
        {
            int leftValue=array[left];
            if(leftValue<=pivot)
                left++;
            else break;
        }

        //left的value全都小于Pivot
        if(left==array.length)
        {
            int[] leftArray=new int[array.length-1];
            System.arraycopy(array,0,leftArray,0,array.length-1);
            if(sort(leftArray,0,leftArray.length-2))
            {
                //覆盖原数组
                System.arraycopy(leftArray,0,src,0,leftArray.length);
                src[src.length-1]=array[array.length-1];
                System.out.print("result is ");
                println(src);
                return true;
            }
            throw new Exception("left array sorted failed !"+ leftArray);

        }
        else //leftvalue>pivot
        {
            //移动right;
            while(right>left)
            {
                int rightValue=array[right];
                if(rightValue>=pivot)
                    right--;
                else break;
            }

            if(right<=left)
            {
                //交换leftvalue和pivot
                int leftValue=array[left];
                array[left]=pivot;
                array[array.length-1]=leftValue;
                System.out.print("switch left with pivot");
                println(array);

                //0~ left-1 重排序
                int[] leftArray=new int[left];
                System.arraycopy(array,0,leftArray,0,left);
                if(!sort(leftArray,0,leftArray.length-2))
                    throw new Exception("left array sorted failed !"+ leftArray);

                //left+1 ~ end 重排序
                int[] rightArray=new int[array.length-left-1];
                System.arraycopy(array,left+1,rightArray,0,array.length-left-1);
                if(!sort(rightArray,0,rightArray.length-2))
                    throw new Exception("left array sorted failed !"+ rightArray);

                System.arraycopy(leftArray,0,src,0,leftArray.length);
                System.arraycopy(rightArray,0,src,left+1,rightArray.length);
                src[left]=array[left];

                System.out.print("result is ");
                println(src);
                return true;

            }else
            {
                //rightValue<pivot
                //交换leftvalue rightvalue
                int leftValue=array[left];
                array[left]=array[right];;
                array[right]=leftValue;
                System.out.print("switch left and right");
                println(array);

                if(!sort(array,left+1,right-1))
                    throw new Exception("left array sorted failed !"+ array);

                System.arraycopy(array,0,src,0,src.length);

                System.out.print("result is ");
                println(src);
                return true;

            }
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值