十种排序算法

学的东西还是要多分享,分享给别人的过程中才会知道自己原来有的地方并不是很清楚,今天就再复习一次排序算法了,我希望大家看了之后对排序算法能够有进一步的了解,也是对自己知识的巩固~
先了讲讲比较复杂的快速排序好了

快速排序

快速排序的基本思想就是用一个中间值,将待排序的内容分为:小于等于中间值的部分 大于中间值的部分,形成局部有序。然后再递归的排序小于等于中间值的部分、大于中间值的部分。
那么在算法实现上,我们需要两个指针:i、j,其中j的取值范围为0-n-1,用来遍历待分区的数组元素,而i的初始值为-1,用来指向在小于等于中间值部分中的最后一个元素的位置。这样当我们遍历j的时候,我们比较j元素和中间值的大小:如果小于等于中间值,那么意味要将j元素放在i+1的位置上,同时要将i+1,更新最后一个小于等于中间值的元素的位置;如果大于中间值,那么i不变;因此我们可以知道在【0,i】区间内的元素都是小于等于中间值的,而i+1,n-1的范围内时大于中间值的元素,这样下次递归就有目标了。

//快速排序
    public static void quickSort(int[] arrays, int start, int end){

         if(end <= start)return;

         int key = arrays[end];
         int lessIndex = start-1;

         for(int i= start; i < end; i++){

             if(arrays[i] < key){
                 lessIndex++;
                 int temp = arrays[lessIndex];
                 arrays[lessIndex] = arrays[i];
                 arrays[i] = temp;
             }
         }
         lessIndex++;
         arrays[end] = arrays[lessIndex];
         arrays[lessIndex] = key;
        quickSort(arrays, start, lessIndex-1);
        quickSort(arrays, lessIndex+1, end);

    }

堆排序

堆排序和选择排序的思想一致,只不过在堆排序中是通过堆来获得n-1个布局最大值的。所谓的堆的定义:大顶堆:左右子树根节点要小于根节点,同时左右子树也是一个大顶堆。在这个实现中,主要的一个算法是如何在更换了根节点之后,将这个元素下沉到它应该在的位置上。
percDown(int a[],int root,int max)表示将元素root下沉到合适的位置,然后最大的指针为max。
这样在排序的时候就能够利用这个函数了。

 //8:堆排序
    public static void heapSort(int[] arrays){

         int len = arrays.length;
         if(len <= 1)return;
         for(int i= (len/2-1); i>=0; i--){

             if(2*i+1 < len){//如果存在左子树
                 int maxT = 2*i+1;
                 if(2*i+2 < len && arrays[2*i+2] > arrays[maxT])
                     maxT = 2*i+2;
                 if(arrays[maxT] > arrays[i]){

                     int temp = arrays[maxT];
                     arrays[maxT] = arrays[i];
                     arrays[i] = temp;

                 }
             }
         }
         for(int i=len-1; i>0; i--){

             int temp = arrays[i];
             arrays[i] = arrays[0];
             arrays[0] = temp;
             percDown(arrays, i);

         }
    }

    public static void percDown(int[]arrays, int len){

         int unSetV = arrays[0];
         int i=0;

         while(2*i + 1 < len){//当存在左子树当时候

             int maxT = 2*i + 1;
             if(2*i+2 < len && arrays[2*i+2] > arrays[maxT])
                 maxT = 2*i+2;
             if(arrays[maxT] > arrays[i]){
                 arrays[i] = arrays[maxT];
                 i=maxT;
             }else
                 break;

         }

         arrays[i] = unSetV;

    }

冒泡排序

冒泡排序核心思想就是要用两层for循环,第一层for循环是表明我要找n次最大值(或者最小值),把他们放在他们应该放置的位置上,而第二层for循环解决的就是我怎么找到次的最大值,在冒泡排序中第二次for循环就是通过比较并交换相邻两个元素的值来实现次最大值的寻找,在冒泡排序中交换的次数可能会比较多。

//冒泡排序
  

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

小白刷剑指offer 文章被收录于专栏

跟着小白一起刷剑指offer,通过讨论加深印象吧~ 没有人不学习就能够掌握知识,知识就是需要学习的~

全部评论

相关推荐

#简历#先说一说我自己的想法,很多人都很排斥苍穹外卖,认为没什么技术点和含金量,但实际上我觉得恰恰相反,苍穹外卖虽然代码本身并不是你自身能力的证明,但是是作为一个新人学习时很好的跳板和原始框架,在这个框架上进行的改进可以很好的辐射到你自己的个人成果上,并作为你和面试官聊天的筹码大多数人的苍穹外卖只写增删改查,千篇一律,吸引不了面试官,所以这才让大家误以为只要是苍穹外卖就不要写进简历里这种误区,但实际上如果你在原有的层面上进行改进,并作为你的项目亮点和面试官介绍,告诉他你的苍穹外卖和别人的有什么不同,增加了哪些技术难点,这才显得你是完全自己理解了这个项目,并且有自己动手实践项目的能力,而不是就看了个课程就以为自己会了,就当成自己的了,如此一来,这反而成为你的加分项苍穹外卖为什么看的人最多,说明它好啊,如果它不好,为什么看的人还这么多,想清楚这个逻辑,我觉得要做的最重要的事,就是如何在原有框架上进行改进提效,比起听其他人的话重新搞一个项目性价比高得多,而且我亲测项目并没有成为我找到工作的阻碍,我投的大厂一大半都给我面试了,而且很多不止一个部门,退一万步说,当你手头没有其他项目的时候,有苍穹外卖总比什么都没有的好很多,不需要因为苍穹外卖有任何心理负担关于简历的任何部分都欢迎大家提意见,十分感谢大家,祝大家找实习+秋招顺利上岸,offer拿到手软#简历中的项目经历要怎么写##我的上岸简历长这样##最后再改一次简历##简历##简历被挂麻了,求建议#
点赞 评论 收藏
转发
点赞 1 评论
分享
牛客网
牛客企业服务