zoukankan      html  css  js  c++  java
  • 冒泡排序和选择排序算法

    冒泡排序原理

    假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第二个数和第三个数比较,如果第二个数大,第二个数和第三个数交换位置,否则不动……第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第一轮循环结束,最大的数挪到了第十个数的位置,比较进行了9次。
    第二轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动……第八个数和第九个数比较,如果第八个数大,第八个数和第九个数交换位置,否则不动。第二轮循环结束,第二大的数挪到了第九个数的位置,比较进行了8次。
    ……
    第九轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动。第九轮循环结束,倒数第二大的数挪到了第二个数的位置,比较进行了1次。
    总体原理:每轮比较找到最大的数。

    冒泡排序的比较示意图

     冒泡排序算法:

     for (int j = 0; j < a.length - 1; j++) {
                for (int i = 0; i < a.length - 1 - j; i++) {
                    if (a[i] > a[i + 1]) {
                        // change
                        temp = a[i + 1];
                        a[i + 1] = a[i];
                        a[i] = temp;
                    }
                }
    }

    选择排序原理

    假设有10个数,第一轮循环,第一个数和第二个数比较,如果第一个数大,第一个数和第二个数交换位置,否则不动;接着第一个数和第三个数比较,如果第一个数大,第一个数和第三个数交换位置,否则不动……第一个数和第十个数比较,如果第一个数大,第一个数和第十个数交换位置,否则不动。第一轮循环结束,最小的数挪到了第一个数的位置,比较进行了9次。
    第二轮循环,第二个数和第三个数比较,如果第二个数大,第而个数和第三个数交换位置,否则不动……第二个数和第十个数比较,如果第二个数大,第二个数和第十个数交换位置,否则不动。第二轮循环结束,第二小的数挪到了第二个数的位置,比较进行了8次。
    ……
    第九轮循环,第九个数和第十个数比较,如果第九个数大,第九个数和第十个数交换位置,否则不动。第九轮循环结束,倒数第二小的数挪到了倒数第二个的位置,比较进行了1次。

    选择排序的动态示意图

     

    选择排序算法:

    for (int j = 0; j <length- 1;j++) {
                for (int i = j; i < length- 1; i++) {
                    if (a[j] > a[i + 1]) {
                        // change
                        temp = a[j];
                        a[j] = a[i + 1];
                        a[i + 1] = temp;
                    }
                }
    }

    选择排序(真)的写法
    在网上看算法动态图时发现,很多选择排序在每一轮比较会记住最小数字的下标,在这一轮比较结束后将最小的数和这一轮比较的第一个数交换。而不是像上面那样每比较一次都有可能交换,因为上面一种算法没有记录最小元素的下标。按这种实现,代码应该写成这样:

    private static void seletSort(int[] a) {
            int length = a.length;
            int temp = 0;
            int minIndex;
            for (int j = 0; j <length- 1;j++) {
                minIndex = j;
                for (int i = j; i < length- 1; i++) {
                    if (a[minIndex] > a[i + 1]) {
                        minIndex = i+1;
                    }
                }
                temp = a[minIndex];
                a[minIndex]= a[j];
                a[j]=temp;
            }
            toString(a);
        }

    选择排序的意思应该是,在一轮比较中,选择当前比较数中最小的那个,放到最前面的位置,从这个角度看,第二种写法更符合选择排序这个名字呢。(这样写避免了无意义的交换)


    ---------------------
    作者:u011109881
    来源:CSDN
    原文:https://blog.csdn.net/u011109881/article/details/80038573

  • 相关阅读:
    spider-抓取页面内容
    Zabbix监控
    时间戳转换
    计算机脱域
    查询指定时间内审核失败的事件日志
    spider-抓取网页内容(Beautiful soup)
    Queue
    spider-抓取网页内容
    MyEclipse+Tomcat配置
    Gradle Java Web应用程序并在Tomcat上运行
  • 原文地址:https://www.cnblogs.com/moodlxs/p/10418767.html
Copyright © 2011-2022 走看看