快速排序 Quick-Sort

快速排序

相关代码

class Sort4 {
    /**
     * 快速排序 Quick-Sort
     * 对冒泡的一种改进
     * 选择一个基准数,将比基准数大的放基准的右边,比其小的放在基准数左边,
     * 通过一趟排序将待排记录分隔成独立的两部分,
     * 其中一部分记录的关键字均比另一部分的关键字小,
     * 则可分别对这两部分记录继续进行排序,以达到整个序列有序。
     *
     * 交换:54321
     * 第一次:4321 5
     * 第二次:321 4 5
     * 第三次:21 3 4 5
     * 第四次:12345
     **/

    public void quickSort(int number[]) {
        if (number.length <= 1 || number == null)
            return;
        else {
           inter(number,0,number.length-1);
        }
    }
    public void inter(int number[],int left,int right){//递归
        if(left<=right){
           return;
        }
        //方法一
        int partitiona=partition1(number,left,right);
        partition1(number,left,partitiona-1);
        partition1(number,partitiona+1,right);
       //方法二
        int partitionb=partition1(number,left,right);
        partition1(number,left,partitionb-1);
        partition1(number,partitionb+1,right);
      //方法三
        int partitionc=partition1(number,left,right);
        partition1(number,left,partitionc-1);
        partition1(number,partitionc+1,right);
    }
     public int partition1(int number[],int left,int right){
        int x=number[left];
        while (left <right) {
            while (x <= number[right] && left < right) {
                right--;
            }
            number[left] = number[right];
            while (number[left] >= x && left < right) {
                left++;
            }
            number[right] = number[left];//填坑
        }
        number[right]=x;
        return left;
            }
    public int partition2(int number[],int left,int right) {
        int b=left;//定义基点
        int begin=left+1;
        int end=right;
        while (begin<end){
            while(number[end]>=b&&left<right)
            {
                end--;
            }
            while(number[begin]>=b&&left<right)
            {
                 begin++;
            }
            while(number[begin]<number[end]&&left<right) {
                int x=number[end];
                number[end]=number[begin];
                number[begin]=x;
            }
        }
        if(b>number[begin])
        {
            number[left]=number[begin];
            number[begin]=b;
        }
        return begin;
    }
    public int partition3(int number[],int left,int right) {
        int b=number[left];;
        int begin=left+1;
        int end=right;

          for(int i=left+1;i<=end;i++){
            if(number[i]<b){//使基点左边值小于基点,右边大于基点
              int c= number[i];
              number[i]=number[begin];
              number[begin]=c;
              begin++;
            }
        }
          if(number[begin-1]<b)
          {
              number[left]=number[begin-1];
              number[begin-1]=b;
          }
        return begin-1;
    }

}
发布了38 篇原创文章 · 获赞 0 · 访问量 1114

猜你喜欢

转载自blog.csdn.net/weixin_45489155/article/details/104892521