选择排序--Selection sort

原理

选择排序,是冒泡排序的优化。

每一趟只交换一次。就是选择最大(或者最小的)和首位交换。

例子

现有无序数组[6 5 4 1 8 9]

第一趟找到最小数1,放到最前边(与首位数字交换)

交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

第二趟找到余下数字[5 4 6 8 9]里的最小数4,与当前剩余数组的首位数字进行交换

交换前:| 1 | 5 | 4 | 6 | 8 | 9 |

交换后:| 1 | 4 | 5 | 6 | 8 | 9 |

第三趟继续找到剩余[5 6 8 9]数字里的最小数5,实际没有交换,5在首位置无须交换

第四趟从剩余的[6 8 9]里找到最小数6,实际没有交换

第五趟从剩余的[8 9]里找到最小数8,发现它在正确的位置,没有交换

排序完毕输出正确结果| 1 | 4 | 5 | 6 | 8 | 9 |

第一趟找到最小数1的细节

当前数组是| 6 | 5 | 4 | 1 | 8 | 9 |

先把6取出来,让它扮演最小数

当前最小数6与其它数一一进行比较,发现更小数就交换角色

当前最小数6与5比较,发现更小数,交换角色,此时最小数是5,接下来5与剩余数字比较

当前最小数5与4比较,发现更小数,交换角色,此时最小数是4,接下来4与剩余数字比较

当前最小数4与1比较,发现更小数,交换角色,此时最小数是1,接下来1与剩余数字比较

当前最小数1与8比较,不动

当前最小数1与9比较,不动,到达末尾

当前最小数1与当前首位数字进行位置交换,如下所示

交换前:| 6 | 5 | 4 | 1 | 8 | 9 |

交换后:| 1 | 5 | 4 | 6 | 8 | 9 |

完成一趟排序,其余步骤类似

参考代码

/**
 * @Description:简单选择排序算法的实现
 */
public class SelectSort {
    // -------------------------------------------------------
    // 第一趟排序: 原始数据:5 2 8 4 9 1
    // 最小数据1,把1放在首位,也就是1和5互换位置,
    // 排序结果:1 2 8 4 9 5
    // -------------------------------------------------------
    // 第二趟排序:
    // 第1以外的数据{2 8 4 9 5}进行比较,2最小,
    // 排序结果:1 2 8 4 9 5
    // -------------------------------------------------------
    // 第三趟排序:
    // 除1、2以外的数据{8 4 9 5}进行比较,4最小,8和4交换
    // 排序结果:1 2 4 8 9 5
    // -------------------------------------------------------
    // 第四趟排序:
    // 除第1、2、4以外的其他数据{8 9 5}进行比较,5最小,8和5交换
    // 排序结果:1 2 4 5 9 8
    // -------------------------------------------------------
    // 第五趟排序:
    // 除第1、2、4、5以外的其他数据{9 8}进行比较,8最小,8和9交换
    // 排序结果:1 2 4 5 8 9
    // ------------------------------------------------------

    public static void selectSort(int[] arr) {
        if (arr == null || arr.length == 0)
            return;
        int minIndex = 0;
        // 选择排序,是冒泡排序的优化
        for (int i = 0; i < arr.length; i++) {// 只需要比较n-1次
            System.out.println("i======" + i);
            minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {// 从i+1开始比较,因为minIndex默认为i了,i就没必要比了。
                System.out.println("j======" + j);
                if (arr[j] < arr[minIndex]) {
                    minIndex = j;
                }
            }
            if (minIndex != i) { // 如果minIndex不为i,说明找到了更小的值,交换之。
                swap(arr, i, minIndex);
            }
        }

        System.out.println("结果为==========================");
        for (int i : arr) {
            System.out.println(i);
        }
    }

    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = { 8, 10, 2, 1, 5, 4 };
        new SelectSort().selectSort(arr);
    }

}

猜你喜欢

转载自www.cnblogs.com/llq1214/p/9717661.html
今日推荐