快速排序

来源:互联网 发布:淘宝让朋友刷有风险吗 编辑:程序博客网 时间:2024/06/05 02:59

        今天毕业已经六个多月了,进入公司也已经九个多月了,听见前辈去给新生面试说越临近年末来面试的人员质量越差,所以提醒各位将毕业的筒子们要早点发力或者努力提高自己的技能哟。

        回归正题,这是我第一次写博客,是想写个类似日记的东西来记录自己学习过的知识,因为之前看会的东西后来又忘记了或者模糊了又要翻好久,这不今天听见前辈说面了个新生连快速排序是什么都不知道,我心想哎呀我怎么好像也记不清是什么了,都工作这么久了,因为用的少所以就淡忘了。

        那么到底什么是快速排序呢?

       快速排序是顾名思义那样是速度快的排序吗?不见得,快速排序的英文名字是什么?Quicksort,简单直接的翻译过来确实快速排序,那么实际中的应用到底快不快呢?因为我是个菜鸟我就不去探讨什么复杂度等等的了,在这里只是介绍一下概念,和代码实现。

        首先我们要有一个序列,排序嘛,肯定要一个序列(一个数组)来比较得到从小到大或者从大到小的结果集。我们假设初始序列为 a[12,3,8,6,1,56,9,35,10],长度为9;

        第二,万事要有个开始,快速排序首先需要两个指针指向第一个和最后一个a[0]和a[a.length-1],其实就是两个标识数组的第一个元素和最后一个元素,这里我用f指向第一个元素,l指向最后一个元素。f->a[0]=12、l->a[8]=10;

        第三,指向尾端的指针前移,首先判断l指向的值,即10小于第一个值12,l不移动;

        第四,l停住之后,f开始向后移动寻找比12大的第一个遇到的值,即当f->a[5]=56时停住;

        第五,此时l和f都已停住,此时交换f和l指向的两个值,序列由原来的a[12,3,8,6,1,56,9,35,10]变为a[12,3,8,6,1,10,9,35,56],值变了但是f和l指向的位置不变;

        第六,第一次比较完仍然是l先移动,即回到第三步,当l->a[6]=9时,l遇到了第二个小于12的值,l停住;

        第七,回到第四步,f开始移动,当f->a[6]=9时f未找到比12大的值但是f和l碰面了,所以f也停住;

        第八,回到第五步,交换12和两个指针相遇的值,序列由a[12,3,8,6,1,10,9,35,56]变为a[9,3,8,6,1,10,12,35,36];

        第九,两个指针重合的地方是a[6]=12,现在以12为中点不动,前后分为两个数组继续排序即左边[9,3,8,6,1,10]右边[35,36];

        第十,继续第三到第九步分别排序左边和右边的序列;

        左边序列[9,3,8,6,1,10]:

        第一遍:[1,3,8,6,9,10]此时又以9为中点分为左边[1,3,8,6]右边[10]

        第二遍:[1,3,8,6]f和l相遇在1,所以要以1为中点右边[3,8,6]

        第三遍:[3,8,6]f和l相遇在3,所以要以3为中点右边[8,6]

        第四遍:[8,6]排序后[6,8]至此左边已排好为[1,3,6,8,9,10]

        第五遍:[35,36]已排好,所以最终排好序的结果为a[1,3,6,8,9,10,12,35,36]。


        java实现:

public class Main {
    public static void main(String[] args) {
        int aa[] = new int[] { 12, 3, 8, 6, 1, 56, 9, 35, 10 };
        sort(aa, 0, 8);
        for (int a : aa) {
            System.out.println(a + ",");
        }

    }

    public static int getHigh(int[] list, int low, int high) {

        int f, l, temp, t;
        temp = list[low];
        while (low != high) {
            while (list[high] > temp && high > low) {//从最后向前移动对应第三到第六步
                high--;
            }
            t = list[high];
            while (list[low] < temp && high > low) {//从前向后移动对应第七步
                low++;
            }
            list[high] = list[low];
            list[low] = t;
        }//一个循环结束排好第一次f和l相遇

        return high;
    }

    public static void sort(int[] array, int low, int high) {
        if (low >= high) {
            return;
        }
        int iHigh = getHigh(array, low, high);
        sort(array, low, iHigh- 1);//递归排一次结束之后中点左边的序列
        sort(array, iHigh+ 1, high);//递归排一次结束之后中点右边的序列
    }

}


       第一次写博客不过也是自己看的,知识这种东西也不知道这样写算不算原创,但是确实是自己理解写的,但这东西发明的人毕竟不是我,所以有冒犯的地方还请各方神圣谅解。

原创粉丝点击