ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于快速排序的二三事

2021-03-19 15:03:13  阅读:183  来源: 互联网

标签:right int quickSort 二三 test 排序 快速 public


在学习快速排序之前我们来看一下什么冒泡排序

import java.util.Arrays;

public class 冒泡排序 {
    public static void main(String[] args) {

        int[] test = new int[]{9, 1, 5, 8, 7, 4, 6, 2};
        //用于交换的临时值
        int temp = 0;
        for (int i = 0; i < test.length; i++) {
            for (int j = test.length - 1; j > i; j--) {
            //如果前一位数比后一位大则交换两个数
                if (test[j - 1] > test[j]) {
                    temp = test[j - 1];
                    test[j - 1] = test[j];
                    test[j] = temp;
                }
            }
        }
        //记得Java的话直接test.toString()可是没法输出数组的...
        System.out.println(Arrays.toString(test));

    }
}

冒牌排序的核心思路是两两交换, 它是一种时间换空间的排序算法, (因为它不耗费什么额外空间), 最坏情况是把逆序的数列变成顺序, 所以最差的时间复杂度是O(N^2), 最好的情况下是O(N)一遍过, 平均就是O(N^2)

快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

就是你选择一个点, 然后左端有端两个指针, 把比那个点小的放在左边, 大的放右边, 递归处理.

最差情况显而易见, 划分之后一边是一个, 另一边是n-1个, 这种极端情况的时间复杂度就是O(N^2), 最好的情况就是每次都能均匀的划分序列(中轴两边的数相等), 时间复杂度就是O(N*log2N)

正因为如此, 所以它不稳定, 而冒泡排序是稳定的O(N^2)

现在让我们来尝试实现一下快速排序

package baguwen;

import java.util.Arrays;

public class quickSort {


    public static void main(String[] args) {
        int a[] = {3, 5, 9, 4, 11, 6, 7, 25, 33, 54, 99};
        quickSort(a, 0, a.length - 1);
        System.out.println(Arrays.toString(a));
    }

    public static void quickSort(int[] a, int left, int right) {
        int pivot = a[(left + right) / 2];
        //pivot作为中轴 比它小的放在左边 比它大的放在右边
        int l = left;
        int r = right;
        while (l < r) {
            //开始比较! 只要左指针的位置不超过右指针的位置就不能停下来
            while (a[l] < pivot) {
                //在左侧找到一个比中轴值大的为止
                l = l + 1;
            }
            while (pivot < a[r]) {
                //在右侧找到一个比中轴值小的为止
                r = r - 1;
            }
            if (l <= r) {
                //交换他们俩!
                int temp = a[l];
                a[l] = a[r];
                a[r] = temp;
                l++;
                r--;
                //至于为什么要l++和r--,你想想如果不加的话是不是就陷入死循环了
            }
            //这样就进行完一个轮回啦, 马上就要开始下一个轮回了冲冲冲
        }
        if (left < r) {
            quickSort(a, left, r);
        }
        if (l < right) {
            quickSort(a, l, right);
        }
    }

}

标签:right,int,quickSort,二三,test,排序,快速,public
来源: https://blog.csdn.net/BedivereAlter/article/details/115005945

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有