排序 —— 选择排序(Selection sort)

2023-05-16

       简介 选择排序是一种直观的排序,但是不稳定的排序方法。

一、思路

             首先在未排序序列中找到最小或最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小或最大元素,然后放到已排序序列的末尾。重复此步骤,直到所有元素全部排序完毕。

二、时间复杂度和空间复杂度

        选择排序的比较操作为 n(n-1)/2 次之间,赋值操作介于 0 和 3 (n - 1) 次之间。比较次数

O(n^2),比较次数与关键字的初始状态无关,总的比较次数N=(n-1)+(n-2)+...+1=n*(n-1)/2。

交换次数O(n),最好情况是,已经有序,交换0次;最坏情况交换n-1次,逆序交换n/2次。交换次

数比冒泡排序少多了,由于交换所需CPU时间比比较所需的CPU时间多,n值较小时,选择排序比

冒泡排序快

        平均时间复杂度是\large O(n^2)

        空间复杂度是\large O(1)      

        选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里

面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下

它一个最大的元素了。那么,在一趟选择,如果一个元素比当前元素小,而该小的元素又出现在一

个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。举个例子,序列5 8 5 2 9,我们知

道第一遍选择第1个元素5会和2交换,那么原序列中两个5的相对前后顺序就被破坏了,所以选择

排序是一个不稳定的排序算法。 不稳定!

三、代码

1、java代码实现(优化转)

​
public static void selectionSort(int[] nums) {

    if (nums == null || nums.length < 2) {
        return;
    }

    for(int i = 0; i < nums.length - 1; i++) {
        for(int j = i + 1; j < nums.length; j++) {
            if(nums[i] > nums[j]) {
                swap(nums, i, j);
            }
        }
    }

}

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

​

2、C++代码

两种较优解法

>>1

#include<bits/stdc++.h>
using namespace std;
void SelectSort(vector<int> vec){
    for(int i=0;i<vec.size()-1;++i){
        int min=i;
        //查找最小元素的位置
        for(int j=i+1;j<vec.size();++j){
            if(vec[min]>vec[j]) min=j;
        }
        // 更新最小的元素
        if(min!=i){
            int temp=vec[i];
            vec[i]=vec[min];
            vec[min]=temp;
        }
 
    }
    for(int i=0;i<vec.size();++i) cout<<vec[i]<<endl; //输出排序后的数组
}
int main(){
    vector<int > vec={49,38,65,97,76,13,27,49};
    SelectSort(vec); //排序函数
    return 0;
}

>>2 

#include<iostream>
using namespace std;
 
void print(int a[], int n)
{  
    for(int j= 0; j<n; j++)
    {  
        cout<<a[j] <<"  ";  
    }  
    cout<<endl;  
}
 
void selectSort(int a[], int len)
{
 
    int minindex, temp;
    for(int i = 0; i<len-1;i++)
    {
        minindex = i;
        for(int j = i+1; j<len; j++)
        {
            if(a[j]<a[minindex])
                minindex = j;
        
        }
        temp = a[i];
        a[i] = a[minindex];
        a[minindex] = temp;
    }
}
 
int main()
{  
    int a[10] = {8,1,9,7,2,4,5,6,10,3};  
    cout<<"初始序列:";  
    print(a,10);  
    selectSort(a,10);  
    cout<<"排序结果:";  
    print(a,10);  
    system("pause"); 
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

排序 —— 选择排序(Selection sort) 的相关文章

  • jQuery - 从文本区域选择所有文本

    我怎样才能做到当您在文本区域内单击时 它的整个内容都会被选中 最终 当您再次单击时 取消选择它 为了防止用户在每次尝试使用鼠标移动插入符号时选择整个文本时感到恼火 您应该使用focus事件 而不是click事件 以下内容将完成这项工作并解决
  • Java JComboBox 监听更改选择事件[重复]

    这个问题在这里已经有答案了 我正在尝试监听 Java JComboBox 中的选择更改 我尝试使用 ActionListener 但问题是这样的 动作侦听器执行类似的操作 public void actionPerformed Action
  • 如何通过索引值和任意列中的值搜索pandas数据框

    我正在尝试选择数据 从文件中读入 由值 1 和 0 表示 我希望能够从值列表中选择行 同时选择其中每个选定行的值为 1 的任何列 为了使其更复杂 我还想从值列表中选择行 其中这些行的列中的所有值均为零 这可能吗 最终 如果除 pandas
  • Android TabLayout 在启动时选择第一个选项卡

    我正在使用 Android 设计库中的 TabLayout 我有多个选项卡 每个选项卡在被选择时都有一个操作 所以我有一个属性 startSelection 它执行 tabLayout getTabAt startSelection sel
  • 计算统计模式

    我目前正在尝试验证 给定一个长度为 N 的未排序数组 A 和一个整数 k 是否存在某个元素出现 n k 次或更多次 我对这个问题的想法是计算众数 然后将其与 n k 进行比较 但是 我不知道如何快速计算此模式 我的最终结果需要是nlog k
  • Firefox 选择文本范围

    一个简单的问题 如何在 FireFox 中以编程方式选择页面的文本片段 例如 有一段文本 用户单击按钮 然后选择第 10 到 15 个符号 就像用户以常规方式拖动鼠标一样 在 Firefox 中 您可以使用Range https devel
  • 如何在 SwiftUI 的列表中启用选择

    我正在尝试使用 SwiftUI 创建一个简单的多重选择列表 我无法让它发挥作用 List 采用第二个参数 即 SelectionManager 因此我尝试创建一个具体的实现 但是 它永远不会被调用 行也永远不会突出显示 import Swi
  • 使用 JS 将链接插入到选定的文本中(当用户专注于输入 URL 时丢失 window.getSelection() 值)

    我正在尝试将链接插入到选定的文本中 这在前端编辑器中很常见 我可以添加一个指向用户文本选择的链接 如下所示 var sel window getSelection var e document createElement a e inner
  • UITextField——观察 selectedTextRange 的变化?

    有什么方法可以观察 UITextField 的 selectedTextRange 的变化吗 我尝试观察所有 UIControlEvents 但更改 selectedTextRange 不会触发 UIControlEvent 另一个死胡同
  • 使用 jQuery 设置文本选择颜色。演示无法运行

    http jsfiddle net uKdPM http jsfiddle net uKdPM 我已经设置了 selectioncss中的颜色 因此当您突出显示屏幕上的文本时 文本的颜色是粉红色的 我现在尝试在页面加载时通过 jQuery
  • android:smoothScrollToPosition()无法正常工作

    在将元素添加到与列表视图关联的数组适配器后 我试图平滑地滚动到列表的最后一个元素 问题是它只是滚动到随机位置 arrayadapter add item DOES NOT WORK CORRECTLY listview smoothScro
  • 从给定列表中选择随机字符串

    我试图让 Java 从给定列表中选择 1 个随机字符串 字符串列表的示例 1153 3494 9509 2 0 0 0 0 1153 3487 9509 2 0 0 0 0 1153 3491 9525 2 0 0 0 0 1153 346
  • 如何通过 VBA 将选择范围扩展到整个段落

    我正在使用此代码将选择范围扩展到Word文档中的整行 现在我想将选择范围扩展到整个段落 Selection Expand wdLine 尝试使用不同的 WdUnit 例如 wdParagraph Selection Expand wdPar
  • Pandas:无法根据字符串相等性进行过滤

    在 python 2 7 OSX 上使用 pandas 0 16 2 我从 csv 文件中读取数据框 如下所示 import pandas as pd data pd read csv my csv file csv sep t skipr
  • bootstrap-vue 选择带有过滤器选项的组件?

    在带有 bootstrap vue 的 vue 项目中 我搜索选择组件的工作原理https bootstrap vue js org docs components form select https bootstrap vue js or
  • 确定选择哪个 JRadioButton 的最佳方法是什么?

    目前我正在以这种方式获取选定的按钮 但如果这是正确 最好的方法 我不会 也许有比这更简单或更面向对象的东西 private int getFilterType JRadioButton buttons for int i 0 n butto
  • 按下 Control 键时 RichTextBox 选择错误

    我在文本选择方面遇到了一个非常奇怪的错误富文本框 我创建了以下简单的表格 public partial class Form1 Form public Form1 InitializeComponent private void Form1
  • 获取选定的文本位置

    目前 我正在浏览器中获取选定的文本 执行以下操作 window getSelection 现在 当按下自定义键时 我需要在该文本上方显示一个工具提示 请注意 鼠标不能再位于文本上方 因此为了做到这一点 我需要该所选文本的绝对位置 有没有办法
  • 使用 Javascript 获取 Mobile Safari 中选定的文本

    因此 我正在开发一个小书签 对于我来说 使用 循环 获取用户选择的内容是理想的选择 window getSelection 和 document getSelection 都是我可以调用的函数 但是它们始终返回空字符串 我相信问题在于 当您
  • 自定义 UITableViewCell 选择样式?

    当我点击我的UITableViewCell 当我单击单元格时 背景部分 我的背景图像未覆盖的区域 会变成蓝色 另外 所有的UILabel单击时单元格上的 s 变为白色 这就是我想要的 然而 我不想要的是当我点击它时的蓝色背景 但如果我这样做

随机推荐