【算法】【排序算法】【04】快速排序

具体思想参考 https://blog.csdn.net/weixin_43734095/article/details/105156039

我的代码:

package _01_sort.cmp;

import _01_sort.Sort;

public class _09_QuickSort<T extends Comparable<T>> extends Sort<T> {
    @Override
    protected void sort() {
        sort(array,0,array.length-1);
    }

    private void sort(T[] array,int low,int high){
        if(low >= high) return;
        int mid = partition(array,low,high);

        sort(array,low,mid-1);
        sort(array,mid+1,high);
    }


    private int partition(T[] array,int low,int high){
        if(low == high) return low;
        int right = high;
        int left = low + 1;
        T pivot = array[low];

        while(right >=  left){
            if(cmp(array[right],pivot)>0){
                right--;
            }else{
                if(cmp(array[left],pivot)<=0){
                    left ++;
                }else{
                    T tmp = array[left];
                    array[left] = array[right];
                    array[right] = tmp;
                    left ++;
                    right--;
                }
            }
        }
        //right = left - 1
        array[low] = array[right];
        array[right] = pivot;
        return right;
    }
}

明哥的代码:

package _01_sort.cmp;

import _01_sort.Sort;

/**
 * 快速排序
 */
public class _09_QuickSortMj<T extends Comparable<T>> extends Sort<T> {

    @Override
    protected void sort() {
        sort(0, array.length);
    }

    /**
     * 对 [begin, end) 范围的元素进行快速排序
     */
    private void sort(int begin, int end) {
        if (end - begin < 2) return;

        // 确定轴点位置 O(n)
        int mid = pivotIndex(begin, end);
        // 对子序列进行快速排序
        sort(begin, mid);
        sort(mid + 1, end);
    }

    /**
     * 构造出 [begin, end) 范围的轴点元素
     *
     * @return 轴点元素的最终位置
     */
    private int pivotIndex(int begin, int end) {
        // 随机选择轴点元素
        swap(begin, begin + (int) Math.random() * (end - begin));
        // 备份begin位置的元素
        T pivot = array[begin];
        // end指向最后一个元素
        end--;
        while (begin < end) {
            while (begin < end) {    // 从右往左扫描
                if (cmp(pivot, array[end]) < 0) { // 右边元素 > 轴点元素
                    end--;
                } else { // 右边元素 <= 轴点元素
                    array[begin++] = array[end];
                    break;
                }
            }
            while (begin < end) { // 从左往右扫描
                if (cmp(pivot, array[begin]) > 0) { // 左边元素 < 轴点元素
                    begin++;
                } else { // 左边元素 >= 轴点元素
                    array[end--] = array[begin];
                    break;
                }
            }
        }
        // 将轴点元素放入最终的位置
        array[begin] = pivot;
        // 返回轴点元素的位置
        return begin; // begin==end
    }

}
【_09_QuickSort】
稳定性:false 	耗时:0.005s(5ms) 	比较:43.99万	 交换:0
------------------------------------------------------------------
【_08_MergeSort2】
稳定性:false 	耗时:0.006s(6ms) 	比较:26.11万	 交换:0
------------------------------------------------------------------
【_09_QuickSortMj】
稳定性:false 	耗时:0.006s(6ms) 	比较:32.23万	 交换:1.26------------------------------------------------------------------
【_08_MergeSort】
稳定性:true 	耗时:0.007s(7ms) 	比较:26.11万	 交换:0
------------------------------------------------------------------
【_03_HeapSort】
稳定性:false 	耗时:0.012s(12ms) 	比较:51.08万	 交换:2.00------------------------------------------------------------------
【_05_Insert_BinarySearch】
稳定性:true 	耗时:0.265s(265ms) 	比较:26.08万	 交换:0
------------------------------------------------------------------
【_02_Select】
稳定性:true 	耗时:0.392s(392ms) 	比较:2.00亿	 交换:2.00------------------------------------------------------------------
【_04_Insert2】
稳定性:true 	耗时:0.49s(490ms) 	比较:1.16亿	 交换:0
------------------------------------------------------------------
【_04_Insert】
稳定性:true 	耗时:0.562s(562ms) 	比较:9929.57万	 交换:9927.57------------------------------------------------------------------
【_01_Bubble】
稳定性:true 	耗时:1.292s(1292ms) 	比较:2.00亿	 交换:9927.57------------------------------------------------------------------
【_01_Bubble_3】
稳定性:true 	耗时:1.813s(1813ms) 	比较:2.00亿	 交换:9927.57------------------------------------------------------------------
【_01_Bubble_2】
稳定性:true 	耗时:1.839s(1839ms) 	比较:2.00亿	 交换:9927.57------------------------------------------------------------------

Process finished with exit code 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值