美文网首页
快速排序&快速排序与归并排序的对比

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

作者: 流浪de球 | 来源:发表于2020-02-01 11:25 被阅读0次

    快速排序算法

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

    /**
     * 快速排序测试类
     *
     * @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)

    归并排序算法

    未完待续……

    相关文章

      网友评论

          本文标题:快速排序&快速排序与归并排序的对比

          本文链接:https://www.haomeiwen.com/subject/lbwtxhtx.html