图解选择排序算法及优化

简介: 图解选择排序算法及优化

文章目录

  1. 算法思想
  2. 算法图解
  3. 代码实现
  4. 选择排序算法的优化
  5. 选择排序特点
  6. 算法思想
  1. 算法图解

以数组array图解选择排序,排序结果为升序

int[] array = {25,33,10,15,70,45};

 假设每个循环开始第一个数是总是最小,minIndex保存最小数的下标i,i范围:从0开始到array.length-1

开始遍历数组,找到最小的数,将索引保存并且交换最小数和当前minIndex所指向的数

 假设最小数是33,开始向后遍历,找到最小数15,交换

 继续循环,25当前是最小,自己和自己交换

  继续循环,33当前是最小,自己和自己交换

 继续循环,最小数是45,和70交换

  继续循环,70当前是最小,自己和自己交换

至此排序完成

  1. 代码实现

import java.util.Arrays;

public class ChoiceSort{

public int[] sortArray(int[] nums){
    if(nums.length == 0){
        return nums;
    }
    for (int i = 0; i < nums.length; i++) {
        int minIndex = i;//最小数的下标,每个循环开始总是假设第一个数是最小数
        for (int j = i; j < nums.length; j++) {
            if (nums[j] < nums[minIndex]){//找到最小数
                minIndex = j;//保存最小数索引
            }
        }
        System.out.println("本轮最小数:"+nums[minIndex]);
        //交换最小数和当前i所指向的元素
        int tmp = nums[minIndex];
        nums[minIndex] = nums[i];
        nums[i] = tmp;
        PrintArray.print(nums);
        System.out.println("————————————————");
    }
    return nums;
}
public static void main(String[] args) {
    int[] array = {25,33,10,15,70,45};
    System.out.println("初始数组:");
    PrintArray.print(array);
    ChoiceSort choiceSort = new ChoiceSort();
    choiceSort.sortArray(array);
    System.out.println("排序完成");
    PrintArray.print(array);
}

}
class PrintArray{

public static void print(int[] array){
    System.out.println(Arrays.toString(array));
}

}
结果:

  1. 选择排序算法的优化

思路:一般是在一趟遍历中,同时找出最大值与最小值,放到数组两端,这样就能将遍历的趟数减少一半

遍历数组找到最大值和最小值 , 将最小值放到数组left处,将最大值放到数组right处,然后继续重复操作,直至排序完成

代码: 

import java.util.Arrays;

public class ChoiceSort{

public int[] sortArray(int[] nums) {
    if (nums.length == 0) {
        return nums;
    }
    /*初始化左端、右端元素索引*/
    int left = 0;
    int right = nums.length - 1;
    while (left < right) {
        /*初始化最小值、最大值元素的索引*/
        int min = left;
        int max = right;
        for (int i = left; i <= right; i++) {
            /*标记每趟比较中最大值和最小值的元素对应的索引min、max*/
            if (nums[i] < nums[min])
                min = i;
            if (nums[i] > nums[max])
                max = i;
        }
        /*最大值放在最右端*/
        int temp = nums[max];
        nums[max] = nums[right];
        nums[right] = temp;
        /*此处是先排最大值的位置,所以得考虑最小值(arr[min])在最大位置(right)的情况*/
        if (min == right)
            min = max;
        /*最小值放在最左端*/
        temp = nums[min];
        nums[min] = nums[left];
        nums[left] = temp;
        /*每趟遍历,元素总个数减少2,左右端各减少1,left和right索引分别向内移动1*/
        left++;
        right--;
    }

    return nums;
}
public static void main(String[] args) {
    int[] array = {25,33,10,15,70,45};
    System.out.println("初始数组:");
    PrintArray.print(array);
    ChoiceSort choiceSort = new ChoiceSort();
    choiceSort.sortArray(array);
    System.out.println("排序完成");
    PrintArray.print(array);
}

}
class PrintArray{

public static void print(int[] array){
    System.out.println(Arrays.toString(array));
}

}
结果: 

  1. 选择排序特点

        待排序序列中,元素个数较少时,适合选用选择排序,时间复杂度为O(n2)
  在选择排序中,每趟都会选出最大元素与最小元素,然后与两端元素交换,此时,待排序序列中如果存在与原来两端元素相等的元素,稳定性就可能被破坏

相关文章
|
4天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之选择排序
Java数据结构与算法:排序算法之选择排序
|
5天前
|
存储 缓存 算法
Python中常用的数据结构与算法优化技巧指南
Python是一种强大而灵活的编程语言,它提供了丰富的数据结构和算法库,但是在处理大规模数据或者需要高效运行的情况下,需要考虑一些优化技巧。本文将介绍一些Python中常用的数据结构与算法优化技巧,并附带代码实例,帮助你更好地理解和运用。
|
7天前
|
算法
基于GA遗传优化的混合发电系统优化配置算法matlab仿真
**摘要:** 该研究利用遗传算法(GA)对混合发电系统进行优化配置,旨在最小化风能、太阳能及电池储能的成本并提升系统性能。MATLAB 2022a用于实现这一算法。仿真结果展示了一系列图表,包括总成本随代数变化、最佳适应度随代数变化,以及不同数据的分布情况,如负荷、风速、太阳辐射、弃电、缺电和电池状态等。此外,代码示例展示了如何运用GA求解,并绘制了发电单元的功率输出和年变化。该系统原理基于GA的自然选择和遗传原理,通过染色体编码、初始种群生成、适应度函数、选择、交叉和变异操作来寻找最优容量配置,以平衡成本、效率和可靠性。
|
8天前
|
机器学习/深度学习 算法
基于鲸鱼优化的knn分类特征选择算法matlab仿真
**基于WOA的KNN特征选择算法摘要** 该研究提出了一种融合鲸鱼优化算法(WOA)与K近邻(KNN)分类器的特征选择方法,旨在提升KNN的分类精度。在MATLAB2022a中实现,WOA负责优化特征子集,通过模拟鲸鱼捕食行为的螺旋式和包围策略搜索最佳特征。KNN则用于评估特征子集的性能。算法流程包括WOA参数初始化、特征二进制编码、适应度函数定义(以分类准确率为基准)、WOA迭代搜索及最优解输出。该方法有效地结合了启发式搜索与机器学习,优化特征选择,提高分类性能。
|
3天前
|
机器学习/深度学习 存储 算法
基于SFLA算法的神经网络优化matlab仿真
**摘要:** 使用MATLAB2022a,基于SFLA算法优化神经网络,降低训练误差。程序创建12个神经元的前馈网络,训练后计算性能。SFLA算法寻找最优权重和偏置,更新网络并展示训练与测试集的预测效果,以及误差对比。SFLA融合蛙跳与遗传算法,通过迭代和局部全局搜索改善网络性能。通过调整算法参数和与其他优化算法结合,可进一步提升模型预测精度。
|
11天前
|
机器学习/深度学习 算法 数据挖掘
机器学习与智能优化——利用简单遗传算法优化FCM
机器学习与智能优化——利用简单遗传算法优化FCM
27 5
|
11天前
|
机器学习/深度学习 算法 数据可视化
m基于PSO-LSTM粒子群优化长短记忆网络的电力负荷数据预测算法matlab仿真
在MATLAB 2022a中,应用PSO优化的LSTM模型提升了电力负荷预测效果。优化前预测波动大,优化后预测更稳定。PSO借鉴群体智能,寻找LSTM超参数(如学习率、隐藏层大小)的最优组合,以最小化误差。LSTM通过门控机制处理序列数据。代码显示了模型训练、预测及误差可视化过程。经过优化,模型性能得到改善。
28 6
|
10天前
|
机器学习/深度学习 算法 搜索推荐
数据结构算法--2 冒泡排序,选择排序,插入排序
**基础排序算法包括冒泡排序、选择排序和插入排序。冒泡排序通过相邻元素比较交换,逐步将最大值“冒”到末尾,平均时间复杂度为O(n^2)。选择排序每次找到剩余部分的最小值与未排序部分的第一个元素交换,同样具有O(n^2)的时间复杂度。插入排序则类似玩牌,将新元素插入到已排序部分的正确位置,也是O(n^2)复杂度。这些算法适用于小规模或部分有序的数据。**
|
11天前
|
算法 调度
基于变异混合蛙跳算法的车间调度最优化matlab仿真,可以任意调整工件数和机器数,输出甘特图
**摘要:** 实现变异混合蛙跳算法的MATLAB2022a版车间调度优化程序,支持动态调整工件和机器数,输出甘特图。核心算法结合SFLA与变异策略,解决Job-Shop Scheduling Problem,最小化总完成时间。SFLA模拟蛙群行为,分组进行局部搜索和全局信息交换。变异策略增强全局探索,避免局部最优。程序初始化随机解,按规则更新,经多次迭代和信息交换后终止。
|
17小时前
|
存储 算法 搜索推荐
Java数据结构与算法优化
Java数据结构与算法优化