• 深入浅出排序算法之简单选择排序


    目录

    1. 原理和执行流程

    2. 代码实现

    3. 性能分析

    4. 双向选择排序(了解)


    1. 原理和执行流程

    选择排序包含了堆排序和简单选择排序。

    每一次从无序区间选出最大(或最小)的一个元素,存放在无序区间的最后(或最前),直到全部待排序的数据元素排完 。

    选择类排序的主要动作是“选择”,简单选择排序采用最简单的选择方式,从头至尾顺序扫描序列。找出最小的一个关键字,和第一个关键字交换,接着从剩下的关键字中继续这种选择和交换,最终使序列有序。

    2. 代码实现

    1. //选择排序
    2. public static void selectSort(int[] array){
    3. for(int i = 0;i < array.length - 1;i++){
    4. //剩下最后一个元素,不需要选择了,因为已经在最合适的位置
    5. boolean flag = false;//用来比较是否更好minIndex的值
    6. int j = i + 1;//往后一位进行比较
    7. int minIndex = i;
    8. for(;j < array.length;j++){
    9. if(array[minIndex] > array[j]){
    10. minIndex = j;
    11. flag = true;
    12. }
    13. }
    14. if(flag){
    15. int tmp = array[minIndex];
    16. array[minIndex] = array[i];
    17. array[i] = tmp;
    18. }
    19. }
    20. }
    21. public static void main(String[] args) {
    22. int[] arr = {3,1,2,4,5};
    23. Sort.selectSort(arr);
    24. for (int x : arr) {
    25. System.out.print(x + " ");
    26. }
    27. }

    3. 性能分析

    时间复杂度空间复杂度
    O(N^2)O(1)
    数据不敏感数据不敏感

    4. 双向选择排序(了解)

    每一次从无序区间选出最小 + 最大的元素,存放在无序区间的最前和最后,直到全部待排序的数据元素排完 。

    1. public static void main(String[] args) {
    2. int[] arr = {5,2,1,3,4};
    3. Sort.selectSortOP(arr);
    4. for (int x : arr) {
    5. System.out.print(x + " ");
    6. }
    7. }
    8. //双向选择排序
    9. //和单向的时间复杂度一致,可能只是更帅一点吧
    10. public static void selectSortOP(int[] array){
    11. int low = 0;
    12. int high = array.length - 1;
    13. // [low, high] 表示整个无序区间
    14. // 无序区间内只有一个数也可以停止排序了
    15. while(low < high){
    16. int min = low;
    17. int max = low;
    18. for(int i = low + 1;i <= high;i++){
    19. if (array[i] < array[min]) {
    20. min = i;
    21. }
    22. if(array[i] > array[max]){
    23. max = i;
    24. }
    25. }
    26. swap(array,low,min);
    27. //见下面解析:最大值可能在low的位置上,min和low一交换,最大值就到了min的位置
    28. if(max == low){
    29. max = min;
    30. }
    31. swap(array,high,max);
    32. low++;
    33. high--;
    34. }
    35. }
    1. array = { 9, 5, 2, 7, 3, 6, 8 }; // 交换之前
    2. // low = 0; high = 6
    3. // max = 0; min = 2
    4. array = { 2, 5, 9, 7, 3, 6, 8 }; // 将最小的交换到无序区间的最开始后
    5. // max = 0,但实际上最大的数已经不在 0 位置,而是被交换到 min 即 2 位置了
    6. // 所以需要让 max = min 即 max = 2
    7. array = { 2, 5, 8, 7, 3, 6, 9 }; // 将最大的交换到无序区间的最结尾后

  • 相关阅读:
    【初识AI】(一):ASR和NLP
    微信小程序和H5之间互相跳转、互相传值
    C# OpenCvSharp 利用Lab空间把春天的场景改为秋天
    409. 最长回文串
    代码随想录 -- day56 -- 583. 两个字符串的删除操作 、72. 编辑距离
    安装RPM包或源码包
    TG Pro for Mac强大的硬件温度检测、风扇控制工具测评
    【图像识别-车牌识别】基于BP神经网络求解车牌识别问题含GUI界面和报告
    Python数据分析培训班介绍
    LeetCode算法练习top100:(5)二叉树
  • 原文地址:https://blog.csdn.net/ANNE_fly/article/details/134034973