快速排序&快速排序与归并排序的对比

快速排序算法

快速排序算法是从上到下解决问题
使用递归实现,通过巧妙的方式,实现原地排序

/**
 * 快速排序测试类
 *
 * @Author WR
 * @Date 2020/2/1 0001 10:51
 */
public class QuickSortTest {

    @Test
    public void test(){
        int[] a = {2,6,8,10,1,3,4,5,9};
        System.out.println("排序前:" + Arrays.toString(a));
        quickSort(a);
        System.out.println("排序后:" + Arrays.toString(a));
    }

    /**
     * 快速排序
     * @param a
     */
    public void quickSort(int[] a) {
        quickSortInternally(a, 0, a.length - 1);

    }

    /**
     * 递归函数
     * @param a
     * @param p
     * @param r
     */
    private void quickSortInternally(int[] a, int p, int r) {
        //递推终止条件
        if (p >= r) {
            return;
        }

        //递推公式
        int q = partition(a, p, r);
        quickSortInternally(a, p, q - 1);
        quickSortInternally(a, p + 1, r);
    }

    /**
     * 分区函数
     *
     * i指针的目的是指向第一个大于pivot的值
     * j指针一直向后遍历
     *
     *
     * @param a
     * @param p
     * @param r 分区点pivot
     * @return
     */
    private int partition(int[] a, int p, int r) {
        //选择最后一个数据作为分区点pivot
        int pivot = a[r];
        int i = p;
        for (int j = p; j < r; j++) {
            if (a[j] < pivot) {
                if (i == j) {
                    //说明之前的数都小于pivot
                    i++;
                } else {
                    //说明i与j相邻且j快i1步 或 i与j之间包含其他数据,且数据大于a[j]。交换i与j且i指向下一个
                    int tmp = a[i];
                    a[i++] = a[j];
                    a[j] = tmp;
                }
            }
        }

        //到此为止,i指向若干次交换后第一个大于pivot的位置,i之前都小于pivot,i之后都大于pivot,交换i与pivot
        int tmp = a[r];
        a[r] = a[i];
        a[i] = tmp;

        return i;
    }

}

分析
时间复杂度O(nlogn),极端情况下O(n^2)
非稳定性排序
原地排序算法,空间复杂度O(1)

归并排序算法

未完待续……

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。