选择排序算法

2021-05-11  本文已影响0人  想象之中丶意料之外

选择排序算法原理

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

思路:

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

举例:数组:[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]交换后】}

第一次最终结果:[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]交换后】}

第二次最终结果:[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]交换后】}

第三次最终结果:[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]交换后】}

规律

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

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;
            }
        }
参考:九大排序算法之选择排序(原理及实现)
上一篇 下一篇

猜你喜欢

热点阅读