美文网首页
选择排序算法

选择排序算法

作者: 想象之中丶意料之外 | 来源:发表于2021-05-11 18:29 被阅读0次

选择排序算法原理

从头至尾查找最小的一个元素,然后和第一个元素交换,接着从剩下的元素中继续这种选择和交换方式,最终得到一个有序数组。

思路:

步骤1:先假设数组第1个元素为最小,记录目前最小下标,然后以最小下标的数字进行依次比较,如果出现比目前还小的数字,则更新最小下标。
步骤2:找打整个数组最小下标后,将最小的下标数字与假设的数字进行换位。

  • 从剩余的数字中,重复上述步骤,再找到剩余数字中最小,然后交换。最终得到一个有序数组。

举例:数组:[3,7,2,1,4] 选择排序

  • 第一次,在\color{red}{3,7,2,1,4}中找最小数字

1、先假设一个最小下标:每次都以数组剩余个数最左边的下标假设为最小下标【故第一次时:假设最小下标为0】。
2、拿假设的最小下标0,进行依次比较,找到实际最小下标:
最小下标0,与下标1比较【3小于7,最小下标不变】
\color{red}{最小下标0,与下标2比较【3大于2,更新最小下标为2】}
\color{red}{最小下标2,与下标3比较【2大于1,更新最小下标为3】}
最小下标3,与下标4比较【1小于4,最小下标不变】
3、找到整个数组中最小的数字下标\color{red}{“3”},将实际最小数字,与假设最小数字进行位置交换。\color{red}{故得到:1,7,2,3,4【交换前:[3,7,2,1,4]=>[1,7,2,3,4]交换后】}

  • 第二次,\color{red}{在剩余的数字7,2,3,4中找最小数字}

第一次最终结果:[1,7,2,3,4]
1、还是先假设一个最小下标:第二次从[1,7,2,3,4]里假设一个最小下标\color{red}{应该是1,【因为整个数组0下标已经确定为最小数字了,所不需要再处理】}
2、拿假设的最小下标1,进行依次比较,找到实际最小下标:
最小下标1,与下标2比较【7大于2,最小下标更新为2】
最小下标2,与下标3比较【2小于3,最小下标不动】
最小下标2,与下标4比较【2小于4,最小下标不动】
3、找到整个数组中第二小的数字下标\color{red}{“2”},将实际第二小数字,与假设第二小数字进行位置交换。\color{red}{故得到:1,2,7,3,4【交换前:[1,7,2,3,4]=>[1,2,7,3,4]交换后】}

  • 第三次,\color{red}{在剩余的数字7,3,4中找最小数字}

第二次最终结果:[1,2,7,3,4]
1、还是先假设一个最小下标:第三次从[1,2,7,3,4]里假设一个最小下标\color{red}{应该是2,【因为整个数组0、1下标已经处理过了,不需要处理】}
2、拿假设的最小下标2,进行依次比较,找到实际最小下标:
最小下标2,与下标3比较【7大于3,最小下标更新为3】
最小下标3,与下标4比较【3小于4,最小下标不动】
3、找到整个数组中第三小的数字下标\color{red}{“3”},将实际第三小数字,与假设第三小数字进行位置交换。\color{red}{故得到:1,2,3,7,4【交换前:[1,2,7,3,4]=>[1,2,3,7,4]交换后】}

  • 第四次,\color{red}{在剩余的数字7,4中找最小数字}

第三次最终结果:[1,2,3,7,4]
1、还是先假设一个最小下标:第四次从[1,2,3,7,4]里假设一个最小下标\color{red}{应该是3,【因为整个数组0、1、2下标已经处理过了,不需要处理】}
2、拿假设的最小下标3,进行依次比较,找到实际最小下标:
最小下标3,与下标4比较【7大于4,最小下标更新为4】
3、找到整个数组中第四小的数字下标\color{red}{“4”},将实际第四小数字,与假设第四小数字进行位置交换。\color{red}{故得到:1,2,3,4,7【交换前:[1,2,3,7,4]=>[1,2,3,4,7]交换后】}

规律

从上述例子中,发现一个规律:

  • 总查找最小数字次数是数组长度-1,因为当找到数组第二大数字时,与剩余数字交换位置后,已经形成最终排序结果。
  • 每次进行剩余数字找最小数字时,数组前面的都不需要进行比较处理了。
  • 每次比较,都是已假设下标的下一个下标进行开始比较。因为假设最小下标前的元素已经处理好了,不需要处理。假设最小下标自己占用一个下标。
  • 每次比较,不需要进行换位处理,待找到最小数字下标后,才做换位处理。
  • 每次换位时,如果假设最小下标真的是最小下标,那么不需要进行换位处理。

java代码

    int[] a = {3, 7, 2, 1, 4};
        // 总查找最小次数,小于数组长度-1,因为最后2个数只需要找一次就好了。
        for (int i = 0; i < a.length - 1; i++) {
            int min = i;    // 先假设 i 是最小下标
            for (int j = i + 1; j < a.length; j++) {
                /*int j = i, 就是从剩余数字中找最小数字下标。
                 * int j = i + 1, 是因为假设最小下标,已经算作一个了。故从最小下标下一个元素进行比较。
                 * 
                 * 判断剩余元素中,是否存在小于最小下标元素的数字。
                 * 无:最小下标不更新。
                 * 有:说明假设最小下标错误,更新最小下标。
                 *     然后接着往后比较,
                 *     看有没有比当前已找到的最小下标,
                 *     还小的数字。
                 */
                if (a[j] < a[min]) {
                    min = j;
                }
            }
            /*
             * 确认:假设最小下标是否成立?
             * 成立:不需要做换位处理。
             * 不成立:做换位处理。
             */
            if (min != i) {
                int tmp = a[i];
                a[i] = a[min];
                a[min] = tmp;
            }
        }
参考:九大排序算法之选择排序(原理及实现)

相关文章

网友评论

      本文标题:选择排序算法

      本文链接:https://www.haomeiwen.com/subject/dthndltx.html