首页 > 代码库 > 5. 排序算法2

5. 排序算法2

图解

技术分享


1. 选择排序

    /*
     * 选择排序 
     * 
     * 在未排序序列中找到最小元素,存放到排序序列的起始位置 再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。
     * 以此类推,直到所有元素均排序完毕。
     */
    int[] num = {2,3,1,5,4};
    //控制遍历次数
    for (int i = 0; i < num.length-1; i++) {
        //记录每次遍历的起始下标位置,默认为最小值
        int minIndex = i;
        for (int j = i+1; j < num.length; j++) {
            if (num[j]<num[i]) {
                minIndex = j;
            }
        }
        //每次遍历结束,最小值和起始位置互换值
        int temp = num[i];
        num[i] = num[minIndex];
        num[minIndex] = temp;
    }
    //打印输出
    for (int i : num) {
        System.out.print(i+"\t");
    }

2. 冒泡排序

    /*
     * 冒泡排序
     * 
     * 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
     * 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
     * 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
     */
    int[] num1 = {1,3,4,6,2,11,19,2,7,0};
    // 控制遍历次数
    for (int i = 0; i < num1.length-1; i++) {
        int temp = 0;
        //控制每次遍历比较次数
        for (int j = 0; j < num1.length-1; j++) {
            //如果后一个数更小就和前一个数交换值
            if (num1[j+1]<num1[j]) {
                temp = num1[j];
                num1[j] = num1[j+1];
                num1[j+1] = temp;
            }
        }
        //打印每次遍历之后的数组
        System.out.println("第"+(i+1)+"次遍历后的数组:");
        for (int j : num1) {
            System.out.print(j+" ");
        }
        System.out.println();
    }
    //输出
    System.out.println("经过冒泡排序后的数组:");
    for (int i : num1) {
        System.out.print(i+" ");
    }

3. 直接插入排序

    /*
     * 直接插入排序 
     * 
     * 从第一个元素开始,该元素可以认为已经被排序
     * 取出下一个元素,在已经排序的元素序列中从后向前扫描
     * 如果前面元素大,则前面元素向后移一位
     * 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
     * 将新元素插入到该位置中
     * 重复步骤2
     */
    int[] num2 = {3, 4, 2, 1, 5, 6, 9, 8, 7, 0 };
    //控制遍历次数
    for (int i = 1; i < num2.length; i++) {
        int temp = num2[i];
        int j = i;
        for (j = i; j > 0 && temp < num2[j-1]; j--) {
            //num[2] = 2时
            //j=2;num2[2]=num2[1];3 4 4 ...;j=1;继续内层循环
            //j=1;num2[1]=num2[0];3 3 4 ...;j=0;跳出内层循环
            num2[j] = num2[j-1];
        }
        //j=0;num[0]=2;2,3,4...
        num2[j] = temp;
        //打印每次移动后的数组
        System.out.println("第"+i+"次移动后的数组:");
        for (int k : num2) {
            System.out.print(k+" ");
        }
        System.out.println();
    }
    //输出
    System.out.println("经过直接插入排序之后的数组:");
    for (int i : num2) {
        System.out.print(i+" ");
    }

4. 阶乘

/*
 * 阶乘的方法递归算法
 * 
 * 1!   = 1 
 * 2!   = 2 x 1             = 2 x 1! 
 * 3!   = 3 x 2 x 1         = 3 x 2! 
 * 4!   = 4 x 3 x 2 x 1     = 4 x 3! 
 * ......
 */ 
static int factorial(int n) {
    // return n*(n-1)!
    if (n < 1) {
        return 0;
    }
    if (n == 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
    }
}

5. 归并排序

技术分享

/*    
    (1)申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 
    (2)设定两个指针,最初位置分别为两个已经排序序列的起始位置 
    (3)比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 
    (4)重复步骤3直到某一指针达到序列尾 
    (5)将另一序列剩下的所有元素直接复制到合并序列尾
*/
public static void merge(int[] num, int low, int mid, int high) {
    int[] temp = new int[high - low + 1];
    int left = low;// 左边数组的起始位置
    int right = mid + 1;// 右边数组的起始位置
    int index = 0;
    // 比较拆分的两个子数组,依次取最小值,放入新数组,并移动指针到后一位
    while (left <= mid && right <= high) {
        if (num[left] < num[right]) {
            temp[index++] = num[left++];
        } else {
            temp[index++] = num[right++];
        }
    }
    // 把左边剩余的数移入数组
    while (left <= mid) {
        temp[index++] = num[left++];
    }
    // 把右边边剩余的数移入数组
    while (right <= high) {
        temp[index++] = num[right++];
    }
    // 把新数组中的数覆盖nums数组
    for (int i = 0; i < temp.length; i++) {
        num[i + low] = temp[i];
    }
    System.out.println(Arrays.toString(temp));
}

public static int[] mergeSort(int[] num, int low, int high) {
    int mid = (low + high) / 2;
    if (low < high) {
        // 递归拆分左边
        mergeSort(num, low, mid);
        // 递归拆分右边
        mergeSort(num, mid + 1, high);
        // 左右归并,将拆分的有序数组排序
        merge(num, low, mid, high);
        System.out.println(Arrays.toString(num));
    }
    return num;
}

public static void main(String[] args) {
    int[] num3 = {14,12,15,13,11,16};
    int[] num0 = mergeSort(num3, 0, num3.length-1);
    System.out.println("排序结果:" + Arrays.toString(num0));
}

 

<style>html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video { margin: 0; padding: 0; border: 0 } body { font-family: Helvetica, arial, freesans, clean, sans-serif; font-size: 14px; line-height: 1.6; color: #333; background-color: #fff; padding: 20px; max-width: 960px; margin: 0 auto } body>*:first-child { margin-top: 0 !important } body>*:last-child { margin-bottom: 0 !important } p,blockquote,ul,ol,dl,table,pre { margin: 15px 0 } h1,h2,h3,h4,h5,h6 { margin: 20px 0 10px; padding: 0; font-weight: bold } h1 tt,h1 code,h2 tt,h2 code,h3 tt,h3 code,h4 tt,h4 code,h5 tt,h5 code,h6 tt,h6 code { font-size: inherit } h1 { font-size: 28px; color: #000 } h2 { font-size: 24px; border-bottom: 1px solid #ccc; color: #000 } h3 { font-size: 18px } h4 { font-size: 16px } h5 { font-size: 14px } h6 { color: #777; font-size: 14px } body>h2:first-child,body>h1:first-child,body>h1:first-child+h2,body>h3:first-child,body>h4:first-child,body>h5:first-child,body>h6:first-child { margin-top: 0; padding-top: 0 } a:first-child h1,a:first-child h2,a:first-child h3,a:first-child h4,a:first-child h5,a:first-child h6 { margin-top: 0; padding-top: 0 } h1+p,h2+p,h3+p,h4+p,h5+p,h6+p { margin-top: 10px } a { color: #4183C4; text-decoration: none } a:hover { text-decoration: underline } ul,ol { padding-left: 30px } ul li>:first-child,ol li>:first-child,ul li ul:first-of-type,ol li ol:first-of-type,ul li ol:first-of-type,ol li ul:first-of-type { margin-top: 0px } ul ul,ul ol,ol ol,ol ul { margin-bottom: 0 } dl { padding: 0 } dl dt { font-size: 14px; font-weight: bold; font-style: italic; padding: 0; margin: 15px 0 5px } dl dt:first-child { padding: 0 } dl dt>:first-child { margin-top: 0px } dl dt>:last-child { margin-bottom: 0px } dl dd { margin: 0 0 15px; padding: 0 15px } dl dd>:first-child { margin-top: 0px } dl dd>:last-child { margin-bottom: 0px } pre,code,tt { font-size: 12px; font-family: Consolas, "Liberation Mono", Courier, monospace } code,tt { margin: 0 0px; padding: 0px 0px; white-space: nowrap; border: 1px solid #eaeaea; background-color: #f8f8f8 } pre>code { margin: 0; padding: 0; white-space: pre; border: none; background: transparent } pre { background-color: #f8f8f8; border: 1px solid #ccc; font-size: 13px; line-height: 19px; overflow: auto; padding: 6px 10px } pre code,pre tt { background-color: transparent; border: none } kbd { background-color: #DDDDDD; background-image: linear-gradient(#F1F1F1, #DDDDDD); background-repeat: repeat-x; border-color: #DDDDDD #CCCCCC #CCCCCC #DDDDDD; border-style: solid; border-width: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 10px; padding: 1px 4px } blockquote { border-left: 4px solid #DDD; padding: 0 15px; color: #777 } blockquote>:first-child { margin-top: 0px } blockquote>:last-child { margin-bottom: 0px } hr { clear: both; margin: 15px 0; height: 0px; overflow: hidden; border: none; background: transparent; border-bottom: 4px solid #ddd; padding: 0 } table th { font-weight: bold } table th,table td { border: 1px solid #ccc; padding: 6px 13px } table tr { border-top: 1px solid #ccc; background-color: #fff } table tr:nth-child(2n) { background-color: #f8f8f8 } img { max-width: 100% }</style>

5. 排序算法2