六、八种主流排序算法

六、排序算法

许多算法优化本来就是空间换时间,比如redis,缓存等,从用户角度讲并不关心内存,他们只关心速度

6.1 排序分类

排序算法分类
各个算法平均时间复杂度和最坏时间复杂度


6.2 冒泡排序

冒泡排序就像水里冒泡一样,每次循环都能找到最大的数并将其放在最后

需要注意的是:

  • 一层循环表示的是循环多少趟从而找到多少个最大值,循环次数为个数-1,因为最后一个数就是最小的,不用循环

  • 二层循环表示的是找出某一趟中的最大值,循环次数需要依次递减,因为前面找到的最大值就没必要同后面的数进行比较。

优化:

  • 如果某一趟依次都没有循环表示这些数已经有序了,就没必要进行循环了 ,定义一个boolean判断

  • 注意每次进入内层循环前需要重置flag值

<span style="background-color:#333333"> <span style="color:#c88fd0">public</span> <span style="color:#1cc685">void</span> <span style="color:#8d8df0">bubbleSort</span>(<span style="color:#1cc685">double</span> []<span style="color:#b8bfc6">list</span>){
        <span style="color:#1cc685">boolean</span> <span style="color:#b8bfc6">flag</span>  <span style="color:#b8bfc6">=</span> <span style="color:#84b6cb">true</span>;<span style="color:#da924a">//判断数组手否已经有序</span>
        <span style="color:#1cc685">double</span> <span style="color:#b8bfc6">temp</span>;
        <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span><span style="color:#b8bfc6">-</span><span style="color:#64ab8f">1</span>; <span style="color:#b8bfc6">i</span><span style="color:#b8bfc6">++</span>) {<span style="color:#da924a">//循环给定长度-1次,最后一个数不用循环</span>
            <span style="color:#b8bfc6">flag</span> <span style="color:#b8bfc6">=</span> <span style="color:#84b6cb">true</span>; <span style="color:#da924a">//每次进来需要将falg重置</span>
            <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span><span style="color:#b8bfc6">-</span><span style="color:#b8bfc6">i</span><span style="color:#b8bfc6">-</span><span style="color:#64ab8f">1</span>; <span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">++</span>) {
                 <span style="color:#da924a">//每次循环结束都能找到最大值,因此下一次循环就不用同上一次找到的值比较,所以下一次只需要</span>
                 <span style="color:#da924a">//循环list.length-i-1次</span>
                <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>] <span style="color:#b8bfc6">></span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">+</span><span style="color:#64ab8f">1</span>]){
                     <span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>];
                    <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">+</span><span style="color:#64ab8f">1</span>];
                    <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">+</span><span style="color:#64ab8f">1</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">temp</span>;
                    <span style="color:#b8bfc6">flag</span> <span style="color:#b8bfc6">=</span> <span style="color:#84b6cb">false</span>;
                }
            }
            <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">flag</span> <span style="color:#b8bfc6">==</span> <span style="color:#84b6cb">true</span>){<span style="color:#da924a">//表示数组已经有序</span>
                <span style="color:#c88fd0">break</span>;
            }
​
        }
​
        <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">double</span> <span style="color:#b8bfc6">v</span> : <span style="color:#b8bfc6">list</span>) {
            <span style="color:#b8bfc6">System</span>.<span style="color:#b8bfc6">out</span>.<span style="color:#b8bfc6">print</span>(<span style="color:#b8bfc6">v</span><span style="color:#b8bfc6">+</span><span style="color:#d26b6b">" "</span>);
        }
    }</span>

6.3 选择排序

选择排序需要注意和冒泡排序的区别:

  • 选择排序每次找到最小值或者最大值,但是它是在二层循环结束之后才进行交换操作的,冒泡排序是在二层循环中进行交换操作的

选择排序需要注意:

  • 每次循环需要用一个变量index记住当前最小值或者最大值的下标,便于后面的交换操作

  • 如果想改变排序顺序只需要改变二层循环中的判断条件

  • 最后一个数不需要循环操作,因此外层循环是给定个数-1次

  • 内层循环每次都需要遍历到最后一个数与之比较

<span style="background-color:#333333"> <span style="color:#c88fd0">public</span> <span style="color:#1cc685">void</span> <span style="color:#8d8df0">selectionSort</span>(<span style="color:#1cc685">double</span>[] <span style="color:#b8bfc6">list</span>) {
<span style="color:#da924a">//        选择排序是在循环完后才进行交换操作</span>
<span style="color:#da924a">//        冒泡排序是在循环过程中就进行了交换操作</span>
        <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span> <span style="color:#b8bfc6">-</span> <span style="color:#64ab8f">1</span>; <span style="color:#b8bfc6">i</span><span style="color:#b8bfc6">++</span>) {<span style="color:#da924a">//循环给定数-1次 最后一个数不需要循环就已经确定了</span>
            <span style="color:#1cc685">double</span> <span style="color:#b8bfc6">min</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i</span>];<span style="color:#da924a">//记录最小值</span>
            <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">index</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">i</span>;<span style="color:#da924a">//记录当前最小值的下标</span>
            <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">+</span> <span style="color:#64ab8f">1</span>; <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span>; <span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">++</span>) {
                <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">min</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>]) {
                    <span style="color:#b8bfc6">min</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>];
                    <span style="color:#b8bfc6">index</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">j</span>;
                }
            }
            <span style="color:#c88fd0">if</span>(<span style="color:#b8bfc6">index</span><span style="color:#b8bfc6">!=</span><span style="color:#b8bfc6">i</span>){<span style="color:#da924a">//当找到比当前值还小的数时才交换</span>
            <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">index</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i</span>];
            <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">min</span>;
            }
        }
        <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">double</span> <span style="color:#b8bfc6">v</span> : <span style="color:#b8bfc6">list</span>) {
            <span style="color:#b8bfc6">System</span>.<span style="color:#b8bfc6">out</span>.<span style="color:#b8bfc6">print</span>(<span style="color:#b8bfc6">v</span> <span style="color:#b8bfc6">+</span> <span style="color:#d26b6b">" "</span>);
        }
    }</span>

6.4 插入排序

插入排序思路:插入排序是将一个集合看做两部分,一个有序表,一个无序表;从第一个数开始,那么第一个数就是右一个元素构成的有序表,其他元素构成无序表;从第二个元素开始进行判断,将当前元素(第二个元素)同有序表中的值从后往前进行比较,找到合适的位置插入构成新的有序表,以此类推最终整个集合都为有序表。

插入排序 选择排序 冒泡排序三者区别:

插入排序每次排序的数不知道是最大值还是最小值

选择排序每次排序的一定是最大值或者最小值

冒泡排序每次每次排序的也一定是最大值或者最小值

选择排序每次选出最值与前面已排序好的索引下标+1进行交换,冒泡排序每次都进行交换

插入排序需要注意的几点:

  • 始终记住集合分为两部分:有序表和无序表

  • 第一个元素最开始默认就是有序的,所以遍历的次数为n-1次,也就是遍历是从1开始的,而不是将集合长度-1进行遍历

  • 切记循环判断是从有序表的后面向前进行判断的;如果从前往后进行判断需要将整个有序表后移,但是从后往前遍历就不会出现这种情况,因为有序表本来就是有序的了,从后往前遍历必然每次交换都只是将两个值进行交换操作。

<span style="background-color:#333333"><span style="color:#c88fd0">public</span> <span style="color:#c88fd0">static</span> <span style="color:#1cc685">void</span> <span style="color:#8d8df0">insertSort</span>(<span style="color:#1cc685">double</span>[] <span style="color:#b8bfc6">list</span>) {
       <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">index</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>;<span style="color:#da924a">//记录</span>
       <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">1</span>; <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span> ; <span style="color:#b8bfc6">i</span><span style="color:#b8bfc6">++</span>) {<span style="color:#da924a">//只需要遍历n-1次,因为第一个元素默认为有序的</span>
           <span style="color:#1cc685">double</span> <span style="color:#b8bfc6">cuur</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i</span>];<span style="color:#da924a">//存储当前需要排序的数</span>
           <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">i</span>; <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">></span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">--</span>) {<span style="color:#da924a">//从有序表中进行遍历,将当前cuur数插入到合适的为止</span>
               <span style="color:#b8bfc6">index</span><span style="color:#b8bfc6">++</span>;
               <span style="color:#da924a">//从后往前遍历</span>
               <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">-</span> <span style="color:#64ab8f">1</span>] <span style="color:#b8bfc6">></span> <span style="color:#b8bfc6">cuur</span>) {<span style="color:#da924a">//如果前一个数大于当前数就交换</span>
                   <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">-</span> <span style="color:#64ab8f">1</span>];<span style="color:#da924a">//将当前值位置替换为需要交换的数的值,相当于把前一个数后移</span>
                   <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">-</span> <span style="color:#64ab8f">1</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">cuur</span>;<span style="color:#da924a">//将前面那个数的位置值变为当前值,相当于把当前值前移</span>
               }<span style="color:#c88fd0">else</span> {
                   <span style="color:#c88fd0">break</span>;
               }
           }
       }
   }</span>

6.5 希尔排序(缩小增量排序)

希尔排序思路:希尔排序是插入排序的升级,即先将数据分组(每次除2得到分组数)插入排序,然后到只能分为一组时在进行一次插入排序就完成了排序,组数在不断缩小,每组中的数量在不断增加。

希尔排序

对于希尔排序来讲有两种插入方法:一种是交换法(效率低下,比不上普通的插入排序),一种是移位法(高效,结合插入排序)

注意

  1. 在进行希尔排序的过程中,需要考虑判断条件的情况放置的先后顺序,比如 while (temp-i>=0 && curr<list[temp-i] ) 这个while中的判断条件如果调换就会报数组越界异常,因为 && 是短路与 当执行前面为假时后面就不会再继续执行

  2. 进行希尔排序时要时刻想着插入排序的思路

<span style="background-color:#333333"> <span style="color:#c88fd0">public</span> <span style="color:#c88fd0">static</span> <span style="color:#1cc685">void</span> <span style="color:#8d8df0">shellSort2</span>(<span style="color:#1cc685">double</span>[] <span style="color:#b8bfc6">list</span>) {
​
        <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span> <span style="color:#b8bfc6">/</span> <span style="color:#64ab8f">2</span>; <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">></span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">/=</span> <span style="color:#64ab8f">2</span>) {<span style="color:#da924a">//i表示要分为多少组</span>
            <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">i1</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">i</span>; <span style="color:#b8bfc6">i1</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span>; <span style="color:#b8bfc6">i1</span><span style="color:#b8bfc6">++</span>) { <span style="color:#da924a">// 具体的每一组,按照插入排序进行,从后向前</span>
                <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i1</span>] <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i1</span> <span style="color:#b8bfc6">-</span> <span style="color:#b8bfc6">i</span>]) {<span style="color:#da924a">//当前值小于有序表中最后一个元素,需要进行插入排序</span>
                    <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">i1</span>;
                    <span style="color:#1cc685">double</span> <span style="color:#b8bfc6">curr</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i1</span>];<span style="color:#da924a">//当前需要进行插入排序的值</span>
                    <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">-</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">>=</span> <span style="color:#64ab8f">0</span> <span style="color:#b8bfc6">&&</span> <span style="color:#b8bfc6">curr</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">-</span> <span style="color:#b8bfc6">i</span>]) {
                        <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">temp</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">-</span> <span style="color:#b8bfc6">i</span>];
                        <span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">-=</span> <span style="color:#b8bfc6">i</span>;
                    }
                    <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">temp</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">curr</span>;
                }
            }
        }
    }</span>

6.6 快速排序

快速排序是冒泡排序的升级;

基本思路:首先从数组中选择一个值,将这个值作为中轴值,然后将小于这个值和大于这个值的数分别放在两边,然后中轴值两侧重复上述操作 直到所有的数都排成有序的,后面重复操作可以用到递归。 选择策略:选择中值作为中轴;随机值作为中轴值;选择起始值作为中值

具体思路:

  1. 首先创建两个指针,left指向数组首部,right指向数组尾部

  2. 采用中值选择策略,每次都选择中间值作为中轴pivot,然后移动left找到比中值大的数下标,移动right找到比中值小的数小标,没找到的话最终left或者right会等于中值下标。然后判断left和right是否会相等,如果相等就退出;不相等就进行交换。

  3. 交换后需要进行判断,如果交换值中有等于中值的需要手动移动left或者right下标,这样做是为了防止出现死循环

  4. 更具情况调用递归

特别注意:

  • 通过中值进行快速排序时一定要记住我要找的左边都小于中值和右边都大于中值是对于pivot下标而言的,不用可以去关注中值具体的值,只要关注他的下标左右两边就行了。

  • 不要忘了退出条件的判断

  • 交换之后对于值是否等于中值的判断虽然是防止出现交换前两个值都等于中值从而出现死循环的,但是不能笼统的去判断这个这两个值是否都等于中值去解决,因为这样会同时跳过两个值,具体在代码中写了。

    <span style="background-color:#333333"> <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>] <span style="color:#b8bfc6">==</span> <span style="color:#b8bfc6">pivot</span>) {<span style="color:#da924a">//交换后左边等于pivot应该将右边值-1;</span>
                    <span style="color:#b8bfc6">r</span> <span style="color:#b8bfc6">-=</span> <span style="color:#64ab8f">1</span>;
                }
     <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>] <span style="color:#b8bfc6">==</span> <span style="color:#b8bfc6">pivot</span>) {<span style="color:#da924a">//交换后右边等于pivot应该将左边值-1;</span>
                    <span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">+=</span> <span style="color:#64ab8f">1</span>;
                }</span>
    • 对于上面的判断为什么是r-=1和l-=1? --------》 因为 交换后必然是满足循环条件的,值必然会+1或者-1

<span style="background-color:#333333">  <span style="color:#da924a">/**</span>
     <span style="color:#da924a">* 快速排序</span>
     <span style="color:#da924a">*</span>
     <span style="color:#da924a">* @param list  传入的数组</span>
     <span style="color:#da924a">* @param left  数组第一个元素下标</span>
     <span style="color:#da924a">* @param right 数组最后一个元素下标</span>
     <span style="color:#da924a">*/</span>
    <span style="color:#c88fd0">public</span> <span style="color:#1cc685">void</span> <span style="color:#8d8df0">quickSort</span>(<span style="color:#1cc685">int</span>[] <span style="color:#b8bfc6">list</span>, <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">left</span>, <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">right</span>) {
<span style="color:#da924a">//        首先定义两个变量接收left和right</span>
        <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">left</span>;
        <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">r</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">right</span>;
<span style="color:#da924a">//        定义中轴值</span>
        <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">pivot</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[(<span style="color:#b8bfc6">left</span> <span style="color:#b8bfc6">+</span> <span style="color:#b8bfc6">right</span>) <span style="color:#b8bfc6">/</span> <span style="color:#64ab8f">2</span>];
        <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>;
<span style="color:#da924a">//        循环遍历</span>
        <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">r</span>) { <span style="color:#da924a">// 没必要等于,等于就表示左右两侧都已经满足小于中轴只和大于中轴值</span>
​
<span style="color:#da924a">//            极端条件都是l或者r等于pivot下标位置退出循环</span>
            <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>] <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">pivot</span>) { <span style="color:#da924a">//在左侧找到比中轴值大的数</span>
                <span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">+=</span> <span style="color:#64ab8f">1</span>;
            }
            <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>] <span style="color:#b8bfc6">></span> <span style="color:#b8bfc6">pivot</span>) { <span style="color:#da924a">//在右侧找到比中轴值小的数</span>
                <span style="color:#b8bfc6">r</span> <span style="color:#b8bfc6">-=</span> <span style="color:#64ab8f">1</span>;
            }
​
            <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">==</span> <span style="color:#b8bfc6">r</span>) {<span style="color:#da924a">//如果相等表示左右两侧已经有序了</span>
                <span style="color:#c88fd0">break</span>;
            }
<span style="color:#da924a">//            找到之后进行交换</span>
            <span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>];
            <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>];
            <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">temp</span>;
​
<span style="color:#da924a">//            交换后这里有一点需要特别注意,可能会导致程序进入死循环</span>
<span style="color:#da924a">//           1. 如果交换前l或者r正处在pivot的位置,那么交换后上面的其中一个循环是不会继续执行的,此时如果交换前后该位的值都为pivot,那么程序就会一直进入循环状态</span>
<span style="color:#da924a">//           2. 上面说的,如果某一个值为pivot,那么以后while循环都不会执行里面的代码,以后的循环始终有一个不会执行,会大大拉低效率</span>
<span style="color:#da924a">//            所以需要进行判断认为的将l或者r下标移动,但是移动不能判断list[l]==list[r]然后两个l和r同时移动,因为这样会跳过两个数,如果出现下面情况就无法成功</span>
<span style="color:#da924a">//                  【0,0,1,2,1,5】这种情况l和r都在1,如果跳l和r都等于2了,排序失败</span>
<span style="color:#da924a">//            if (list[l]==list[r]){</span>
<span style="color:#da924a">//                l+=1;</span>
<span style="color:#da924a">//                r-=1;</span>
<span style="color:#da924a">//            }</span>
            <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>] <span style="color:#b8bfc6">==</span> <span style="color:#b8bfc6">pivot</span>) {<span style="color:#da924a">//交换后左边等于pivot应该将右边值-1;</span>
                <span style="color:#b8bfc6">r</span> <span style="color:#b8bfc6">-=</span> <span style="color:#64ab8f">1</span>;
            }
            <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>] <span style="color:#b8bfc6">==</span> <span style="color:#b8bfc6">pivot</span>) {<span style="color:#da924a">//交换后右边等于pivot应该将左边值-1;</span>
                <span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">+=</span> <span style="color:#64ab8f">1</span>;
            }
​
        }
        <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">==</span> <span style="color:#b8bfc6">r</span>) {<span style="color:#da924a">//这一步操作方便后面递归找出新的pivot值,前面的中值已经确认就不需要进行操作了</span>
            <span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">+=</span> <span style="color:#64ab8f">1</span>;
            <span style="color:#b8bfc6">r</span> <span style="color:#b8bfc6">-=</span> <span style="color:#64ab8f">1</span>;
        }
​
        <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">left</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">r</span>) {<span style="color:#da924a">//左递归</span>
            <span style="color:#b8bfc6">quickSort</span>(<span style="color:#b8bfc6">list</span>, <span style="color:#b8bfc6">left</span>, <span style="color:#b8bfc6">r</span>);
        }
        <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">right</span> <span style="color:#b8bfc6">></span> <span style="color:#b8bfc6">l</span>) {
            <span style="color:#b8bfc6">quickSort</span>(<span style="color:#b8bfc6">list</span>, <span style="color:#b8bfc6">l</span>, <span style="color:#b8bfc6">right</span>);
        }
​
    }</span>

6.7 归并排序

学到此处我已黔驴技穷,有种世界与我无关的感觉,去他妈的算法,这是人学的吗?好在我还是坚持把这玩意儿归并排序手敲了一遍,又自己推了一遍,但凡涉及到递归那就是要命的勒!!!!看到这里的诸位也不要气馁,毕竟后面还有很多东西递归和回溯在等着诸位😄


  学到这里我还是想吐槽一下对递归的理解,,,递归就不应该去深入,,感觉你就应该在思想上浮在表面,简单点想你认为可以这样,那他 就可以这样运行。。。。。。。虽然你深入下去会陷入俄罗斯套娃式的为什么,但计算机就是可以得出正确答案 😭        说到这里我内心的心酸已经无法言表了,但看到这篇文章的诸位兄台一定可以意会!!!    ·

归并排序使用了递归 + 分治的思想,递归里面肯定就会涉及到回溯,这里我就不说了,递归的心酸懂的都懂!

分治:将大问题分成若干小问题解决,分而治之!

归并排序图解

上面这张图就是对归并排序的图解,想分成若干子数组,直到剩下最后一个元素停止分,然后向上并,每次并得的新数组都是一个有序表,直到最后合并为一个数组,则整个数组都是有序的。对于递归的算法都超级超级抽象,建议通过图解去记忆理解

思路:

按照写代码的逻辑来:

  1. 首先会先写一个合并的函数,用于合并,别管怎么就合并了,就按照将两个有序的数组合并成一个有序的数组去写就行了。。。。

    理解一下 :这里面传入的list是原数组,而left和right其实也都是指向原数组中的下标,并没有说真的传入两个有序的数组,只是在思想上借助left和mid两个下标将原数组分为了left~mid,mid+1~right两个数组,其实还是在原数组中(借助中转数组)进行操作的。

    <span style="background-color:#333333"> <span style="color:#da924a">/**</span>
         <span style="color:#da924a">*</span>
         <span style="color:#da924a">* @param list 原始数组</span>
         <span style="color:#da924a">* @param left 左侧有序数组的起始索引,开始位置</span>
         <span style="color:#da924a">* @param right 右侧有序数组的结束位置</span>
         <span style="color:#da924a">* @param mid 中间位置</span>
         <span style="color:#da924a">* @param temp 中转数组</span>
         <span style="color:#da924a">*   合并</span>
         <span style="color:#da924a">*/</span>
        <span style="color:#c88fd0">public</span>  <span style="color:#1cc685">void</span>  <span style="color:#8d8df0">merge</span>(<span style="color:#1cc685">int</span>[] <span style="color:#b8bfc6">list</span>, <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">left</span>, <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">right</span>, <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">mid</span>, <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">temp</span>[]){
            <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">l</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">left</span>;<span style="color:#da924a">//初始化</span>
            <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">r</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">mid</span><span style="color:#b8bfc6">+</span><span style="color:#64ab8f">1</span>;
            <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">t</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>;<span style="color:#da924a">//指向temp的下标</span>
            <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">l</span><span style="color:#b8bfc6"><=</span><span style="color:#b8bfc6">mid</span> <span style="color:#b8bfc6">&&</span> <span style="color:#b8bfc6">r</span><span style="color:#b8bfc6"><=</span><span style="color:#b8bfc6">right</span>){<span style="color:#da924a">//左右两个有序表都还没遍历完时继续遍历</span>
                <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>]<span style="color:#b8bfc6"><</span><span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>]){
                    <span style="color:#b8bfc6">temp</span>[<span style="color:#b8bfc6">t</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>];
                    <span style="color:#b8bfc6">t</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
                    <span style="color:#b8bfc6">l</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
                }<span style="color:#c88fd0">else</span> {
                    <span style="color:#b8bfc6">temp</span>[<span style="color:#b8bfc6">t</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>];
                    <span style="color:#b8bfc6">t</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
                    <span style="color:#b8bfc6">r</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
                }
            }
    ​
    <span style="color:#da924a">//        将遍历完剩余的数直接追加到temp后面</span>
            <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">l</span><span style="color:#b8bfc6"><=</span><span style="color:#b8bfc6">mid</span>){
                <span style="color:#b8bfc6">temp</span>[<span style="color:#b8bfc6">t</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">l</span>];
                <span style="color:#b8bfc6">l</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
                <span style="color:#b8bfc6">t</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
            }
            <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">r</span><span style="color:#b8bfc6"><=</span><span style="color:#b8bfc6">right</span>){
                <span style="color:#b8bfc6">temp</span>[<span style="color:#b8bfc6">t</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">r</span>];
                <span style="color:#b8bfc6">t</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
                <span style="color:#b8bfc6">r</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
            }
    ​
    <span style="color:#da924a">//        将排序好的中转数组的值拷贝到原数组</span>
            <span style="color:#b8bfc6">t</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>;
            <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">tempLeft</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">left</span>;
            <span style="color:#c88fd0">while</span> (<span style="color:#b8bfc6">tempLeft</span><span style="color:#b8bfc6"><=</span><span style="color:#b8bfc6">right</span>){
                <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">tempLeft</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">temp</span>[<span style="color:#b8bfc6">t</span>];
                <span style="color:#b8bfc6">t</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
                <span style="color:#b8bfc6">tempLeft</span><span style="color:#b8bfc6">+=</span><span style="color:#64ab8f">1</span>;
            }
        }</span>
    1. 写 分 的函数,分就是每次将数组对半进行分,直到left和right相等说明已经分到只剩下一个元素就退出,,,,递归需要注意分为左递归和右递归

      <span style="background-color:#333333"><span style="color:#da924a">/**</span>
           <span style="color:#da924a">*</span>
           <span style="color:#da924a">* @param list 原始数组</span>
           <span style="color:#da924a">* @param left 左侧有序数组的起始索引,开始位置</span>
           <span style="color:#da924a">* @param right 右侧有序数组的结束位置</span>
           <span style="color:#da924a">* @param temp 中转数组</span>
           <span style="color:#da924a">*   分+合并  调用递归实现最终算法</span>
           <span style="color:#da924a">*/</span>
          <span style="color:#c88fd0">public</span>  <span style="color:#1cc685">void</span> <span style="color:#8d8df0">mergeSort</span>(<span style="color:#1cc685">int</span> []<span style="color:#b8bfc6">list</span>,<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">left</span>,<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">right</span>,<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">temp</span>[]){
              <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">left</span><span style="color:#b8bfc6"><</span><span style="color:#b8bfc6">right</span>){
                  <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">mid</span> <span style="color:#b8bfc6">=</span> (<span style="color:#b8bfc6">left</span><span style="color:#b8bfc6">+</span><span style="color:#b8bfc6">right</span>)<span style="color:#b8bfc6">/</span><span style="color:#64ab8f">2</span>;
      <span style="color:#da924a">//            向左递归进行分</span>
                  <span style="color:#b8bfc6">mergeSort</span>(<span style="color:#b8bfc6">list</span>,<span style="color:#b8bfc6">left</span>,<span style="color:#b8bfc6">mid</span>,<span style="color:#b8bfc6">temp</span>);
      <span style="color:#da924a">//            向右递归进行分</span>
                  <span style="color:#b8bfc6">mergeSort</span>(<span style="color:#b8bfc6">list</span>,<span style="color:#b8bfc6">mid</span><span style="color:#b8bfc6">+</span><span style="color:#64ab8f">1</span>,<span style="color:#b8bfc6">right</span>,<span style="color:#b8bfc6">temp</span>);
      <span style="color:#da924a">//            调用合并方法进行合并</span>
                  <span style="color:#b8bfc6">merge</span>(<span style="color:#b8bfc6">list</span>,<span style="color:#b8bfc6">left</span>,<span style="color:#b8bfc6">right</span>,<span style="color:#b8bfc6">mid</span>,<span style="color:#b8bfc6">temp</span>);
              }
          }</span>

6.8 基数排序(桶排序升级 稳定排序算法)

稳定:排序前后数的相对位置不会变化,你如我一个数组{0,1,2,1} ,排序后下标为3的1依然在排序后下标为1的1后面,这样就叫做稳定,否则就是不稳定

技术排序是基于桶排序的算法    是典型的空间换时间的算法

基本思路:

  1. 首先需要准备大小为10的数组,也就是10个桶,下标依次为0~9,首先将每个数按照个位数同桶的下标进行对等,依次放进去

  2. 将所有的数都放进去之后再将所有的数依次桶内拿出来,单个桶内的顺序是先进先出放到原数组中去,得到一个新的序列的数组,

  3. 再次从十位循环上面的操作,如果有百位也循环上面的操作,直到所有位数都排序完成

  4. 最后得到的序列就是排序好的数组。

注意:基数排序有局限性:

排序有相对应的局限性:1.只能排列正整数,小数,负数通通不行。2.当需要排列的数太多时,会造成内存不足的错误。

<span style="background-color:#333333"><span style="color:#b8bfc6">​
​
    <span style="color:#da924a">/**</span>
     <span style="color:#da924a">* 基数排序算法</span>
     <span style="color:#da924a">*</span>
     <span style="color:#da924a">* @param list 传入一个数组</span>
     <span style="color:#da924a">*/</span>
    <span style="color:#c88fd0">public</span> <span style="color:#1cc685">void</span> <span style="color:#8d8df0">radixSort</span>(<span style="color:#1cc685">int</span>[] <span style="color:#b8bfc6">list</span>) {
​
<span style="color:#da924a">//        首先准备10个桶 相当于一个二维数组</span>
        <span style="color:#1cc685">int</span>[][] <span style="color:#b8bfc6">bucket</span> <span style="color:#b8bfc6">=</span> <span style="color:#c88fd0">new</span> <span style="color:#1cc685">int</span>[<span style="color:#64ab8f">10</span>][<span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span>];
<span style="color:#da924a">//        然后将数组中的数字按个位十位百位等分别放进去然后再拿出来</span>
        <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">max</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>;
        <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span>; <span style="color:#b8bfc6">i</span><span style="color:#b8bfc6">++</span>) {
            <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i</span>] <span style="color:#b8bfc6">></span> <span style="color:#b8bfc6">max</span>) {
                <span style="color:#b8bfc6">max</span> <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">i</span>];
            }
        }
        <span style="color:#b8bfc6">System</span>.<span style="color:#b8bfc6">out</span>.<span style="color:#b8bfc6">println</span>((<span style="color:#b8bfc6">max</span> <span style="color:#b8bfc6">+</span> <span style="color:#d26b6b">""</span>).<span style="color:#b8bfc6">split</span>(<span style="color:#d26b6b">"\\."</span>)[<span style="color:#64ab8f">0</span>].<span style="color:#b8bfc6">length</span>());
        <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">10</span>;<span style="color:#da924a">//模数</span>
​
        <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6"><</span> (<span style="color:#b8bfc6">max</span> <span style="color:#b8bfc6">+</span> <span style="color:#d26b6b">""</span>).<span style="color:#b8bfc6">split</span>(<span style="color:#d26b6b">"\\."</span>)[<span style="color:#64ab8f">0</span>].<span style="color:#b8bfc6">length</span>(); <span style="color:#b8bfc6">i</span><span style="color:#b8bfc6">++</span>, <span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">*=</span> <span style="color:#64ab8f">10</span>) {<span style="color:#da924a">//需要循环位数最多的哪个数的 位数次</span>
            <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">current</span>[] <span style="color:#b8bfc6">=</span> <span style="color:#c88fd0">new</span> <span style="color:#1cc685">int</span>[<span style="color:#64ab8f">10</span>];<span style="color:#da924a">//记录每个桶上哪个位置放置的有数据</span>
            <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">list</span>.<span style="color:#b8bfc6">length</span>; <span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">++</span>) {<span style="color:#da924a">//将数放进桶内</span>
                <span style="color:#da924a">//            首先需要从个位取,然后丛十位,百位</span>
                <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">index</span> <span style="color:#b8bfc6">=</span> (<span style="color:#1cc685">int</span>) ((<span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>] <span style="color:#b8bfc6">/</span> (<span style="color:#b8bfc6">temp</span> <span style="color:#b8bfc6">/</span> <span style="color:#64ab8f">10</span>)) <span style="color:#b8bfc6">%</span> <span style="color:#64ab8f">10</span>);
                <span style="color:#b8bfc6">System</span>.<span style="color:#b8bfc6">out</span>.<span style="color:#b8bfc6">println</span>(<span style="color:#d26b6b">"数据 "</span> <span style="color:#b8bfc6">+</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>] <span style="color:#b8bfc6">+</span> <span style="color:#d26b6b">" 取模后的数为:"</span> <span style="color:#b8bfc6">+</span> <span style="color:#b8bfc6">index</span>);
<span style="color:#da924a">//                将数放到对应的桶中去</span>
                <span style="color:#b8bfc6">bucket</span>[<span style="color:#b8bfc6">index</span>][<span style="color:#b8bfc6">current</span>[<span style="color:#b8bfc6">index</span>]] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">j</span>];
                <span style="color:#b8bfc6">current</span>[<span style="color:#b8bfc6">index</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">current</span>[<span style="color:#b8bfc6">index</span>] <span style="color:#b8bfc6">+</span> <span style="color:#64ab8f">1</span>;
            }
<span style="color:#da924a">//            一轮结束后将数据重新放回到原数组中</span>
            <span style="color:#1cc685">int</span> <span style="color:#b8bfc6">listIndex</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>;
            <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">j</span> <span style="color:#b8bfc6"><</span> <span style="color:#64ab8f">10</span>; <span style="color:#b8bfc6">j</span><span style="color:#b8bfc6">++</span>) {<span style="color:#da924a">//遍历10个桶</span>
                <span style="color:#c88fd0">if</span> (<span style="color:#b8bfc6">current</span>[<span style="color:#b8bfc6">j</span>] <span style="color:#b8bfc6">==</span> <span style="color:#64ab8f">0</span>) {
                    <span style="color:#c88fd0">continue</span>;
                }
<span style="color:#da924a">//                遍历第j个桶中的元素并赋值给数组</span>
                <span style="color:#c88fd0">for</span> (<span style="color:#1cc685">int</span> <span style="color:#b8bfc6">k</span> <span style="color:#b8bfc6">=</span> <span style="color:#64ab8f">0</span>; <span style="color:#b8bfc6">k</span> <span style="color:#b8bfc6"><</span> <span style="color:#b8bfc6">current</span>[<span style="color:#b8bfc6">j</span>]; <span style="color:#b8bfc6">k</span><span style="color:#b8bfc6">++</span>) {
                    <span style="color:#b8bfc6">list</span>[<span style="color:#b8bfc6">listIndex</span>] <span style="color:#b8bfc6">=</span> <span style="color:#b8bfc6">bucket</span>[<span style="color:#b8bfc6">j</span>][<span style="color:#b8bfc6">k</span>];
                    <span style="color:#b8bfc6">listIndex</span><span style="color:#b8bfc6">++</span>;
                }
            }
            <span style="color:#b8bfc6">System</span>.<span style="color:#b8bfc6">out</span>.<span style="color:#b8bfc6">println</span>((<span style="color:#b8bfc6">i</span> <span style="color:#b8bfc6">+</span> <span style="color:#64ab8f">1</span>) <span style="color:#b8bfc6">+</span> <span style="color:#d26b6b">"轮数组排序后的结果为:"</span> <span style="color:#b8bfc6">+</span> <span style="color:#b8bfc6">Arrays</span>.<span style="color:#b8bfc6">toString</span>(<span style="color:#b8bfc6">list</span>));
        }
    }
​</span></span>

  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值