博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
5. 排序算法2
阅读量:6148 次
发布时间:2019-06-21

本文共 3533 字,大约阅读时间需要 11 分钟。

图解


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]

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]

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));}

 

转载于:https://www.cnblogs.com/jeknight/p/6883804.html

你可能感兴趣的文章
hightcharts 3d 堆积图下钻
查看>>
201621123018《Java程序设计》第1周学习报告
查看>>
ArrayList 源码分析
查看>>
BizTalk 2013R2 WCF-LOB Oracle Adapter安装配置/问题&解决方法
查看>>
投票系统之防止重复投票
查看>>
openstack4j
查看>>
Velocity初探小结--Velocity在spring中的配置和使用
查看>>
Spring boot ---- java.lang.NoClassDefFoundError: javax/servlet/ServletContext
查看>>
C# 获取本机的所有ip地址,并过滤内网ip
查看>>
Sqoop 产生背景(一)
查看>>
Oracle Redo Log
查看>>
js-JavaScript高级程序设计学习笔记14
查看>>
std::bind和std::function
查看>>
2016总结
查看>>
指令周期 机器周期 状态周期 振荡时钟周期(时钟周期)(转)
查看>>
恶意程序入侵 dbuspm-session 发现了新的方法制这种恶意程序
查看>>
JavaWeb应用出现HTTP 500-Unable to compile class for JSP 错误 的解决
查看>>
六种微服务架构的设计模式
查看>>
Unity Remote 5 使用
查看>>
swift开发多线程篇 - 多线程基础
查看>>